Spring Bean的生命周期详解

1. Spring Bean的生命周期的定义

Spring Bean 的生命周期指的是从一个普通的 Java 类变成 Bean 的过程.

2. Spring Bean的创建过程

2.1 总的创建过程

普通 Java 类 -> BeanDefinition -> Spring Bean
以注解情况说明,就是 Spring 会扫描指定包下面的 Java 类,然后将其转化成 BeanDefinition 对象,然后 Spring 会根据 BeanDefinition 来创建 bean(主要一点就是 Spring 是根据 BeanDefinition 来创建 Bean)

2.2 BeanDefinition

BeanDefinition 包含了很多内容,举几个例子:factoryBeanName,initMethodName,destoryMethodName,lazyInit, scope,autowireMode,propertyValues...等等。 这些根据名称都知道啥意思,解释一下 autowireMode ,这个表示注入模型属性,记录使用怎样的注入模型,注入模型常用的有根据名称和根据类型、不注入三种注入模型。在我们写注解类的时候为什么不使用 @Autowired 时,其属性就注入不进来呢?那是因为注解类在变成 BeanDefinition 时,其注入类型是不注入,所以此时只有使用 @Autowired 注解进行标记的属性,才会完成依赖注入。

2.3 Java 类 -> BeanDefinition

先来看一下 Spring 中 AbstractApplicationContext 类中的 refresh 方法,这个方法就可以总结创建过程。

关于 Spring Bean 最主要的三个方法:invokeBeanFactoryPostProcessors,registerBeanPostProcessor, finishBeanFactoryInitialization。
invokeBeanFactoryPostProcessors: 这个方法会执行 BeanFactoryPostProcessor 后置处理器和BeanDefinitionRegistryPostProcessor (子接口), 执行顺序:postProcessorBeanDefinitionRegistry -> postProcessorBeanFactory, postProcessorBeanDefinitionRegistry 会扫描指定包下面带有注解的 java 类,比如 @Component,@Controller,@Service等等;然后将根据这些类生成 BeanDefinition 对象,存储到 Spring 的 Map 中,这个在上面说到 Spring 是根据 BeanDefinition 来创建 Bean。
registerBeanPostProcessor:这个方法注册了所有的 BeanPostProcessor 后置处理器,在 Spring Bean 创建时,执行这些后置处理器的方法,这也是 Spring 框架提供的扩展点,可以帮助开发者参与到 Bean 的创建过程。

2.4 BeanDefinition -> Spring Bean

finishBeanFactoryInitialization:该方法完成 Spring Bean 的创建过程,直接上图

2.4.1 InstantiationAwareBeanPostProcessor

该接口的主要作用在于目标对象的实例化过程中需要处理的事情,包括实例化对象的前后过程以及实例的属性设置。在AbstractAutowireCapableBeanFactory#createBean()方法的beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);里面执行了这个后置处理器。
postProcessBeforeInstantiation:在目标对象实例化之前调用,方法的返回值类型是Object。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替该生成的目标对象的实例(正常是代理对象)。如果该方法的返回值代替了目标对象,后续只会调用postProcessAfterInitialization方法,其它方法不会调用;否则按照正常的流程走
postProcessAfterInstantiation:在目标对象实例化之后会调用该方法,这个时候对象只是实例化,并没有设置属性。如果该方法返回false,会忽略属性值的设置;如果返回true,会按照正常流程设置属性值。
postProcessPropertie:这个方法是对属性值进行修改。5.1之前是用的postProcessPropertyValues,5.1之后使用的是postProcessProperties,但业务逻辑是一样的。

2.4.2 SmartInstantiationAwareBeanPostProcessor

该接口继承了InstantiationAwareBeanPostProcessor。
determineCandidateConstructors:该方法获取Bean的构造器
getEarlyBeanReference: 这个较复杂,主要用于解决循环引用的问题,只有单例对象才会调用此方法

2.4.3 BeanPostProcessor


postProcessBeforeInitialization:该方法会在初始化之前进行执行
postProcessAfterInitialization:该方法的执行是在调用init方法之后执行,主要是判断该bean是否需要被AOP代理增强,如果需要的话,则会在该步骤返回一个代理对象。

posted @ 2022-04-08 14:10  OpenSir  阅读(1760)  评论(0编辑  收藏  举报