这几天做项目看到同组的大牛用到了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是通过反射方式实现。