spring 生命周期

引入

前文提过spring把我们开发的业务类转换成Bean的治理,然后把生成的代理对象存活于应用当中向外提供调用服务,而对于Bean中存在的配置信息,例如配置单例还是多例,配置切面编程,配置初始化方法,配置的自动注入属性等等,都是在spring容器中refresh方法中解析,refresh方法并根据配置信息拦截Bean生命周期的每一个阶段来对Bean做处理。所以spring其实已经把Bean生命周期的每一个阶段以接口方式或以xml方式暴露给用户,用户从而可以介入Bean生命周期的每一阶段,并完成对应的逻辑。

BeanFactoryPostProcessor和BeanPostProcessor

谈起生命周期,肯定得先介绍BeanFactoryPostProcessor和ProcessBeanFactory,这两个接口主要在Bean的生命周期三个关键时机做操作,一个是Bean的BeanDefinition解析,一个是Bean实例化,一个Bean的初始化,这两个接口就是在这三个时机的前后做拦截处理。
BeanFactoryPostProcessor
BeanFactoryPostProcessor接口只有一个方法postProcessBeanFactory:
该方法调用时机Bean是BeanDefinition解析之后,未实例化之前执行。
BeanPostProcessor
BeanPostProcessor接口有两个方法postProcessBeforeInitialization和postProcessAfterInitialization:postProcessBeforeInitialization调用时机是Bean实例化之后,初始化之前执行。
postProcessAfterInitialization调用时机是Bean初始化之后执行。

refresh方法主要逻辑

从下图上看refresh方法看:被我圈出来的方法都是跟Bean的生命周期都有关系
prepareRefresh:
该方法主要是从JDK中的类System中读取一些环境配置信息,例如操作系统的配置信息和JVM的配置信息,然后保存到Environment中。
obtainFreshBeanFactory:
该方法主要是创建BeanFactory对象,该对象初始化的时候会解析xml的Bean标签,并把信息保存到BeanDefinition当中。
prepareBeanFactory:
该方法主要是把一些spring应用内部自己实现的一些前置类创建出来并保存到容器当中。
postProcessBeanFactory:
该方法是AbstractApplicationContext扩展给子类实现的空方法,这里不扩展。
invokeBeanFactoryPostProcessors:
该方法就是执行BeanFactoryPostProcessor接口的方法,在Bean处于BeanDefinition状态的时候,对BeanDefinition进行修改。
registerBeanPostProcessors:
该方法主要是添加外部应用实现了BeanPostProcessor接口的后置处理器到容器中。
finishBeanFactoryInitialization:
该方法主要是把处于BeanDefinition状态的Bean实例化出来并完成初始化,大部分涉及生命周期的接口都是在其中进行执行,例如BeanPostProcessors实现类。
spring 生命周期

生命周期的主要状态

处于Bean处于BeanDefinition状态:
BeanFactoryPostProcessor拦截
处于Bean处于BeanDefinition状态,即将实例化:
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation拦截

处于Bean实例化状态,构造函数完成之后调用:
InstantiationAwareBeanPostProcessor.postProcessPropertyValues,属性自动注入实现类拦截
处于Bean实例化状态,初始化之前:
BeanPostProcessor.postProcessBeforeInstantiation拦截
处于Bean初始化状态:
xml文件中Bean标签配置的init-method方法拦截
处于Bean初始化之后:
BeanPostProcessor.postProcessAfterInitialization拦截

处于Bean初始化之后:
InstantiationAwareBeanPostProcessor.postProcessAfterInitialization拦截

finishBeanFactoryInitialization源码

1.preInstantiateSingletons()调用getBean()方法
spring 生命周期
2.getBean()调用doGetBean()
spring 生命周期
3.doGetBean()调用createBean()方法
spring 生命周期
4.createBean()调用两个关键方法
4.1.createBean()调用resolveBeforeInstantiation()方法,从下图看出:
若InstantiationAwareBeanPostProcessor后置处理器拦截了Bean的创建,并返回了一个不为空的Bean对象,则被拦截的Bean对象就不再走spring默认的创建流程,Bean创建流程提前结束,这表明了该Bean生命周期只会被上述后置处理器的接口拦截,不会再被其他后置处理器拦截。
spring 生命周期
4.2createBean()如果可以继续往下走,调用doCreateBean()方法

spring 生命周期
5.doCreateBean()会调用几个关键方法
5.1.调用createBeanInstance()方法,创建一个没有初始化的对象
spring 生命周期
5.2调用populateBean()方法,执行postProcessPropertyValues以及完成自动注入属性
spring 生命周期
5.3.调用initializeBean()方法
spring 生命周期
6.initializeBean()里面调用三个关键方法
6.1.调用BeanPostProcessor.postProcessBeforeInstantiation方法
6.2.调用xml文件中Bean标签配置的init-method方法
6.3.调用BeanPostProcessor.postProcessAfterInitialization方法
spring 生命周期
Bean的生命周期就介绍到这里,欢迎观看!