Spring的生命周期


介绍

大白话 简单来说就是4个阶段

  • 实例化
  • 属性赋值
  • 初始化
  • 销毁
  1. 实例化:第一步,实例化一个bean对象;
  2. 属性赋值:第二步,为bean设置相关属性和依赖;
  3. 初始化:第3~7步,其中5、6步位初始化操作,3,4步在初始化之前执行,第7步在初始化后执行,该阶段结束,才能被用户使用;
  4. 销毁:第8~10步,第8步先在使用前注册了销毁的相关接口,后面的步骤真正销毁bean时执行相应方法。

详解

// AbstractAutowireCapableBeanFactory.java
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
    throws BeanCreationException {
 
    // 1. 实例化
    BeanWrapper instanceWrapper = null;
    if (instanceWrapper == null) {
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    
    Object exposedObject = bean;
    try {
        // 2. 属性赋值
        populateBean(beanName, mbd, instanceWrapper);
        // 3. 初始化
        exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
 
    // 4. 销毁-注册回调接口
    try {
        registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }
 
    return exposedObject;
}

1.实例化bean

对于BeanFactory容器来说,当用户向容器请求一个尚未初始化的 Bean 或初始化 Bean 的时候,如果需要注入另一个尚未初始化的依赖,容器就会调用createBean进行实例化;对于ApplicationContext容器来说,当容器启动结束后,便实例化所有的 Bean。
容器通过获取BeanDefinition对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。 实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口,从而避免了使用反射机制设置属性。

2.属性赋值

实例化后的对象被封装在BeanWrapper对象中,且此时对象仍然是原生的状态,没有进行依赖注入。接着Spring根据BeanDefinition中的信息进行依赖注入,并且通过BeanWrapper提供的设置属性的接口完成依赖注入。

3.初始化

  • 注入Aware接口
    若Spring检测到bean实现了Aware接口,则会为其注入相应的依赖给Bean。

BeanNameAware:该接口用来获取bean的id或者name
BeanFactoryAware:用来获取当前环境的BeanFactory
BeanClassLoaderAware:注入加载当前bean的ClassLoader
ApplicationContextAware:用来获取当前环境的ApplicationContext

  • BeanPostProcessor
    当经过以上步骤,Bean对象被正确构造,但如果想要对象被使用前再进行一些自定义的处理,就可以通过BeanPostProcessor接口实现

    postProcessBeforeInitialzation:被称为前置处理,所有Aware接口的注入就是在这一步完成的。在初始化之前调用此方法
    postProcessAfterInitialzation:这个函数会在InitialzationBean完成后执行,被称为后置处理。在初始化之后调用此方法

  • InitializingBean
    当BeanPostProcessor的前置处理完成后就会进入本阶段

    InitializingBean:该接口只有一个方法afterPropertiesSet(),在属性注入完成后调用

4.销毁

如果 Bean 实现了DispostbleBean接口,Spring 将调用它的destory方法,作用与在配置文件中对 Bean 使用destory-method属性的作用一样,都是在 Bean 实例销毁前执行的方法。

总结

  • 首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;
  • 再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
  • 销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。

补充-Spring bean的注入过程

Spring容器启动时候,会扫描xml配置文件,当扫描到bean标签,会将这个类的全路径以为key,value存到内置的map中




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 2379. Minimum Recolors to Get K Consecutive Black Blocks
  • 2471. Minimum Number of Operations to Sort a Binary Tree by Level
  • 1387. Sort Integers by The Power Value
  • 2090. K Radius Subarray Averages
  • 2545. Sort the Students by Their Kth Score