這幾天做項目看到同組的大牛用到了Spring中的InitializingBean接口實現初始化加載,這裏做下記錄。在Spring中凡是實現了InitializingBean接口的類在初始化加載時都會實現以下方法。
public class TestInitlizationBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("TestInitlizationBean......");
}
}
我們可以在配置文件中做如下測試(環境基於之前章節搭建的Spring源碼環境),
spring-config.xml文件中
<bean id = "test" class="TestInitlizationBean"> </bean>
MyConfClass.java中
@Configuration
public class MyConfClass {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
}
}
輸出結果:
這說明在spring初始化bean的時候,如果bean實現了InitializingBean接口,會自動調用afterPropertiesSet方法。
同樣,spring中提供了init-method爲bean配置初始化方法,那麼他們先後順序會怎麼樣呢
修改spring.xml配置如下
<beans>
<bean id="test" class="TestInitlizationBean" init-method="initMehtod">
</bean>
</beans>
TestInitlizationBean如下:
public class TestInitlizationBean implements InitializingBean {
public void initMehtod(){
System.out.println("TestInitlizationBean....initMehtod.....");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("TestInitlizationBean....afterPropertiesSet");
}
}
輸出結果:
可以看到InitializingBean的afterPropertiesSet方法先於init-method 方法執行。
在Spring源碼中究竟是如何運行的呢,讓我們來一探究竟。
查看AbstractAutowireCapableBeanFactory類中的invokeInitMethods方法
綜上:
1、Spring爲bean提供了兩種初始化bean的方式,實現InitializingBean接口,或指定init-method方法,兩種方式可以同時使用。
2、實現InitializingBean接口是直接調用afterPropertiesSet方法,init-method是通過反射方式實現。