众所周知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指定的方法。