Bean的生命周期


Bean的生命周期

先上一张流程图

8HBWTA.png

从图中可以看出初始化bean的流程主要分为

  1. 实例化Bean
  2. Aware、BeanProcessor处理
  3. bean自己的init方法
  4. 注销bean时执行destroy-method方法

实例化Bean

实例化bean主要是用BeanWrapperImpl,其主要作用是对这个Bean进行包装。Bean的初始化主要是根据策略模式来进行选择是用JDK的动态代理或CGLib的动态代理来实现。关键代码如下:

/** Strategy for creating bean instances. */
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

   protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
           try {
               Object beanInstance;
               final BeanFactory parent = this;
               if (System.getSecurityManager() != null) {
                   beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
                           getInstantiationStrategy().instantiate(mbd, beanName, parent),
                           getAccessControlContext());
               }
               else {
                   beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
               }
               BeanWrapper bw = new BeanWrapperImpl(beanInstance);
               initBeanWrapper(bw);
               return bw;
           }
           catch (Throwable ex) {
               throw new BeanCreationException(
                       mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
           }
       }

在这里getInstantiationStrategy(),通过获取指定的动态代理策略来进行实例化

  • 如何指定使用JDK的proxy?

spring5中貌似没有找到

使用Aware接口

Aware接口是一个具有具有感知能力的接口,其主要的子类分别是BeanNameAwareBeanClassLoaderAwareBeanFactoryAware接口,以上三个接口的方法都是在实例化完成后调用invokeAware实现

BeanPostProcessor增强

BeanPostProcessor是bean的增强器,是spring容器用于增强全部bean的类。主要是初始化的前置方法和后置方法,主要的子类是InstantiationAwareBeanPostProcessorAdapter在初始化前就对bean进行一个预处理,以便进行特殊处理

init-method()

init-method表示的是bean自身定义的初始化方法,只会作用于bean本身的方法。执行时机是在属性赋值后进行执行。主要有

  1. InitializingBean接口
  2. @init-method注解
  3. @PostConstruct,底层的实现是依赖于BeanPostProcessor

DisposableBean

销毁方法

总结

Bean初始化的过程如下:

  1. InstantiationAwareBeanPostProcessor的前置方法
  2. 实列化
    1.1 根据实例化策略选择进行JDK反射或者CGlib反射
    1.2 执行InstantiationAwareBeanPostProcessor的后置方法
    1.3 bean的属性进行赋值
  3. Aware接口处理
  4. BeanProcessors接口的前置处理
  5. init-method方法进行处理
  6. BeanProcessors接口的后置处理
  7. 销毁方法

  TOC