Spring中的InitializingBean接口的使用

  众所周知Spring框架主要的一个功能是IOC容器,IOC就是控制反转将本来需要我们手动实例化bean的过程,交给了Spring去完成。让Spring帮我们去实例化和维护bean。如果我们要在bean实例完成后执行自定义初始化方法怎么办呢?在Spring框架中提供了两种方式,一种是在XML配置bean时指定init-method,另外一种方式是bean实现InitializingBean接口。

举个栗子:

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");        
    }
}

 配置文件:

<bean id="testInitializingBean" class="com.TestInitializingBean" ></bean>

测试代码:

@Test
public void test() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
}

测试结果:

测试 InitializingBean

这说明在spring初始化bean的时候,如果该bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。

那么问题来了,在配置bean的时候使用init-method配置也可以为bean配置初始化方法,那这两个哪个会先执行呢,接下来测试一下。

配置文件:

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

测试结果:

测试 InitializingBean
测试 init-method

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

总结:

1、当我们要在bean实例完成后执行自定义初始化方法时,Spring提供了两种方式,一种是在XML配置bean时指定init-method,另外一种方式是bean实现InitializingBean接口,两种方式可以同时使用。

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

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

猜你喜欢

转载自www.cnblogs.com/icehand1214/p/10067401.html