Bean的生命周期

49 阅读2分钟

生效位置 DefaultListableBeanFactory

  1. 如果是FactoryBean,则....
  2. 如果不是FactoryBean,开始实例化阶段

一、实例化阶段

  1. 获取sharedInstance,非空直接返回该实例,为空继续实例化阶段

  2. 实例化后置处理器执行 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation ,目的是为了提供代理机会。

    1. 如果返回了代理类,则Bean后置处理器执行 BeanPostProcessor#postProcessAfterInstantiation ,并且直接返回该Bean。
  3. 获取Bean实例Instance。

    1. 如果单例池中存在该Bean实例,返回单例池中的Bean。如果单例池中不存在该Bean实例,则调用构造方法获得Bean实例Instance。并且将该Bean实例加入到单例池中
    2. 判断Bean实例如果不是FactoryBean,直接返回该实例。如果是FactoryBean,则返回其getObject方法创建的实例。

      @Configuration 类会被加载为 factoryBean ,通过invoke其内部 @Bean 修饰方法来获得具体的Bean实例

  4. Bean合并(加工)后置处理器接口执行 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition ,合并Bean定义之后调用, 大致为依赖注入的部分功能。其实现类如 CommonAnnotationBeanPostProcessor 、 AutowiredAnnotationBeanPostProcessor 和 ApplicationListenerDetector 等

    被调用代码位于 AbstractAutowireCapableBeanFactory#1116

    例如AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition 实现了将通过@Autowired注入的类加入到injectedElements和checkedElements中,checkedElements过滤掉了非容器管理的实体类,实际注入的成员类是checkedElements中的元素。

  5. 实例化后置处理器执行 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation 。该方法有具体代码的实现类如 AutowiredAnnotationBeanPostProcessor 等。

  6. 实例化后置处理器执行 InstantiationAwareBeanPostProcessor#postProcessProperties 和 #postProcessPropertyValues ,实现Bean内的注入依赖。该方法有具体代码的实现类如 CommonAnnotationBeanPostProcessor 和 AutowiredAnnotationBeanPostProcessor 等

二、初始化阶段(重要,内含AOP、注解等增强功能)

  1. 调用接口 Aware 的实现方法, BeanNameAware#setBeanName 、BeanClassLoaderAware#setBeanClassLoader , BeanFactoryAware#setBeanFactory 等

    被调用代码位于 AbstractAutowireCapableBeanFactory#1791

  2. 初始化后置处理器执行 BeanPostProcessor#postProcessBeforeInitialization , 如果方法返回空,则停止所有后置处理器 postProcessBeforeInitialization 方法的执行,直接返回Bean。该方法有具体代码的实现类如 CommonAnnotationBeanPostProcessor 和 AutowiredAnnotationBeanPostProcessor 等

    被调用代码位于 AbstractAutowireCapableBeanFactory#1796

  3. 如果Bean实现了InitializingBean,则先执行afterPropertiesSet方法,再执行自定义的initMethod

    被调用代码位于 AbstractAutowireCapableBeanFactory#1800

  4. 初始化后置处理器执行 BeanPostProcessor#postProcessAfterInitialization 。

    被调用代码位于 AbstractAutowireCapableBeanFactory#1808

  5. 经过一系列判断,注册 Bean 成为一次性的,具体方法是 registerDisposableBeanIfNecessary 。

    被调用代码位于 AbstractAutowireCapableBeanFactory#661

三、完成阶段

  1. 单例Bean存储到单例池singletonObjects中

四、销毁阶段