Spring spring中InitializingBean接口和ApplicationContextAware接口

来源:互联网 发布:2017手机淘宝装修教程 编辑:程序博客网 时间:2024/05/29 08:57

ApplicationContextAware接口

1.首先什么是ApplicationContext
ApplicationContext的BeanFactory 的子类, 拥有更强大的功能,ApplicationContext可以在服务器启动的时候自动实例化所有的bean,而 BeanFactory只有在调用getBean()的时候才去实例化那个bean, 这也是我们为什么要得到一个ApplicationContext对象, 事实上Spring2相关的web应用默认使用的是ApplicationContext对象去实例化bean, 换一句话说, 在服务器启动的时候,Spring容器就已经实例化好了一个ApplicationContext对象,所以我们要在老的代码里尝试去获取这个对象。

2.这个接口有什么用?
当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得一个ApplicationContext对象,从而获取到ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。

加载Spring配置文件时,如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的setApplicationContext(ApplicationContext context) 方法,获得ApplicationContext对象。在项目中即可通过这个SpringContextHelper调用getBean()方法得到Spring容器中的对象了。

/** * applicationContext静态化 * 使用了ApplicationContextAware接口的类,如果受spring容器管理的 * 话,那么就会自动的调用ApplicationContextAware中的setApplicationContext方法 */public class SpringContextHelper implements ApplicationContextAware {      private ApplicationContext context;      @Override      public void setApplicationContext(ApplicationContext applicationContext)              throws BeansException {          context = applicationContext;      }      //获取Bean    XxxDAO xxxDAO = (xxxDAO)context.getBean("xxxDAO");}  

因为我们在做开发的时候,并不是说在每一个地方都能将属性注入到我们想要的地方去的,比如在Utils使用到dao,我们就不能直接注入了,这个时候就是我们需要封装springContext的时候了,而ApplicationContextAware就起了关键性的作用。


InitializingBean接口

1.InitializingBean接口的作用
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。

当你实现了afterPropertiesSet方法后,spring就会对你提供框架级的支持:当你通过sring容器生产出实现了该接口的类的实例后,它就会调用afterPropertiesSet方法,通过这个方法,你可以检查你的bean是否正确地被初始化了.当然,你也可以用init-method方法.这两种方式可以同时使用,调用的顺序为init-method后调用。
测试程序如下:

import org.springframework.beans.factory.InitializingBean;public class TestInitializingBean implements InitializingBean{    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("测试 InitializingBean");            }    public void testInit(){        System.out.println("测试 init-method");            }}

在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。
输出:

测试 InitializingBean

修改配置文件,加上init-method配置,修改如下:

<bean id="testInitializingBean" class="com.TestInitializingBean" init-method="testInit"></bean>

在配置文件中加入init-method=”testInit”。

spring初始化bean的时候,打印如下结果:

测试 InitializingBean测试 init-method

由结果可看出,在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。

总结

1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用

2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对spring的依赖

3:如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

原创粉丝点击