BeanFactory和ApplicationContext学习

来源:互联网 发布:知乎专栏怎么写文章 编辑:程序博客网 时间:2024/05/01 01:16
 

BeanFactory

功能:负责根据配置文件创建bean实例,可以配置的项目有:

1.        Bean属性值及依赖关系(对其他bean的引用)。

2.        Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)。

3.        Bean初始化和销毁方法。

4.        Bean的依赖关系。

 

l        ID: Java BeanBeanFactory中的唯一标识。代码中通过BeanFactory获取JavaBean实例时需以此作为索引标识。

l        CLASS JavaBean类名

l        Singleton 指定此JavaBean是否采用单例模式,如果为true,则在此BeanFactory范围内,只维护此JavaBean的一个实例。代码通过BeanFactory获取此实例的引用。如为false,则通过BeanFactory获取JavaBean实例时,BeanFactory每次都创建JavaBean的一个新的实例返回

l        Init-method 初始化方法,此方法在BeanFactory创建JavaBean实例之后,在向应用层返回引用之前执行。一般用于一些资源的初始化工作

l        Destory-method 销毁方法,此方法在JavaBean销毁时执行,一般用于释放资源

l        Depends-on Bean依赖关系,一般情况下无需设定

l        <Value> 通过<value />节点可指定属性值。BeanFactory可以自动根据JavaBean对应的属性类型加以匹配。<value></value>表示设定一个空字符串。如果需要设定NULL,必须使用<NULL/>节点

l        <ref> 指定了属性中对BeanFactory中其他Bean的引用关系。在<ref>中,有<local><bean>的引用方式,<local>表示在当前配置文件中搜索引用的Bean<bean>表示在全局范围进行搜索。

 

 

 

 

Spring中的事件传播

ApplicationContext给予Observer模式,提供了针对Bean的事件传播功能。通过ApplicationContext.publishEvent方法,我们可以将事件通知系统内所有的ApplicationListener

 

 

 

 

下面提供一个简单的例子程序,关于登陆。

LoginAction.java

public class LoginAction implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext arg0)

           throws BeansException {

       // TODO Auto-generated method stub

       this.applicationContext = arg0;

    }

    public int login(String username,String password){

        ActionEvent actionEvent = new ActionEvent(username);

       this.applicationContext.publishEvent(actionEvent);

       return 0;

    }

}

上述类实现了ApplicationContextAware接口,通过此接口,获取ApplicationContext实例。

自定义事件类型ActionEvent,继承自ApplicationEvent类。代码如下:

ActionEvent.java

public ActionEvent(Object source){

       super(source);

}

login方法中,调用了ApplicationContext.publishEvent方法,此方法可以将ApplicationEvent类型的事件传播开来,系统内所有ApplicationListener都能得到这个Event

 

下面给处ActionListener类,此类实现了ApplicationListener接口。

public void onApplicationEvent(ApplicationEvent event) {

       if(event instanceof ActionEvent){

           System.out.print(event.toString());

       }

}

 

applicationContext.xml文件中配置如下:

    <bean id="loginAction" class="web.spring.demo.LoginAction"></bean>

    <bean id="listener" class="web.spring.demo.ActionListener"></bean>

测试类如下:

public static void main(String[] args) {

ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");

       LoginAction action = (LoginAction)cxt.getBean("loginAction");

       action.login("prince", "mimamima");

    }

结果如下:web.spring.demo.ActionEvent[source=prince]

在运行期间,ApplicationContext会自动在当前的所有bean中搜索ApplicationListener接口的实现,并将其作为事件接对象。当ApplicationContext.publishEvent方法调用时,所有ApplicationListener接口都会被激发,每个ApplicationListener可以根据事件的类型判断是否是自己要处理的事件,如上面的ActionListener只处理ActionEvent

原创粉丝点击