Bean生命周期的大致过程:实例化→属性注入→初始化→销毁

本文主要探讨一下初始化这个过程:

初始化生命钩子

该阶段主要做bean的初始化操作,包括:回调Aware接口回调初始化方法生成代理对象等:

  1. 回调Aware接口

    包括BeanNameAwareBeanFactoryAware

  2. BeanPostProcessors前置处理器

    • ApplicationContextAwareProcessor:回调一些Aware接口,如:
      • ApplicationContextAware:注入context对象
      • EnvironmentAware:注入Environment对象
    • InitDestroyAnnotationBeanPostProcessor:调用@PostConstruct标注的方法
  3. 回调初始化方法

    • initializingBeanafterPropertiesSet()
    • Bean的init-method
  4. BeanPostProcessors后置处理器

    常用于返回代理对象。

    其中AbstractAutoProxyCreatorAbstractAdvisingBeanPostProcessor都有可能产生代理对象,如:

    • AsyncAnnotationBeanPostProcessor:对@Async进行代理
    • InfrastructureAdvisorAutoProxyCreator:对@Transactional进行代理
  5. 把最终生成的代理对象放入单例池(源码中叫做singletonObjects)中

源码解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
// 1: 回调Aware接口中的方法
invokeAwareMethods(beanName, bean);

Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// 2: 调用前置处理器
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}

try {
// 3: 完成init方法回调
invokeInitMethods(beanName, wrappedBean, mbd);
}

// 4: 调用后置处理器
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}

return wrappedBean;
}