引用原文:
https://www.cmsblogs.com/article/1391375498269036544
[死磕 Spring 29/43] — IOC 之 深入分析 InitializingBean 和 init-method
doCreateBean() 方法主要干三件事情:
- 实例化 bean 对象:createBeanInstance()
- 属性注入:populateBean()
- 初始化 bean 对象:initializeBean()
而初始化 bean 对象时也是干了三件事情,进行了三个检测扩展,也就是可以对bean进行三个不同的定制化处理:
- 激活 Aware 方法
- 后置处理器的应用
- 激活自定义的 init 方法 重点掌握 本篇文章,重点掌握
[死磕 Spring 27/43] — IOC 之 深入分析 Aware 接口
[死磕 Spring 28/43] — IOC 之 深入分析 BeanPostProcessor
[死磕 Spring 29/43] — IOC 之 深入分析 InitializingBean 和 init-method
正文
Spring 在 bean 初始化时进行三个检测扩展,也就是说我们可以对 bean 进行三个不同的定制化处理,前面两篇博客 【死磕 Spring】----- IOC 之 深入分析 Aware 接口 和 【死磕 Spring】----- IOC 之 深入分析 BeanPostProcessor 已经分析了 Aware 接口族 和 BeanPostProcessor 接口,这篇分析 InitializingBean 接口和 init-method 方法。
InitializingBean
Spring 的 InitializingBean 接口为 bean 提供了定义初始化方法的方式,它仅包含了一个方法:afterPropertiesSet()。
public interface InitializingBean {
/**
* 该方法在 BeanFactory 设置完了所有属性之后被调用
* 该方法允许 bean 实例设置了所有 bean 属性时执行初始化工作,如果该过程出现了错误则需要抛出异常
*/
void afterPropertiesSet() throws Exception;
}
Spring 在完成实例化后,设置完所有属性,进行 “Aware 接口” 和 “BeanPostProcessor 前置处理”之后,会接着检测当前 bean 对象是否实现了 InitializingBean 接口,如果是,则会调用其 afterPropertiesSet() 进一步调整 bean 实例对象的状态。
public class InitializingBeanTest implements InitializingBean {
private String name;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBeanTest initializing...");
this.name = "chenssy 2 号";
}
public String getName