流程分明的Spring的Bean生命周期(超好记)

SpringBean生命周期描述了一个Bean从实例化、实例化完毕、初始化、初始化完毕以及加载入上下文中和Bean销毁的过程中执行了那些我们可拓展的点.我们依次从Bean被扫描,BeanDefinition加入到registry中、BeanFactory配置完毕、Bean实例化、Bean属性设置、Bean初始化完毕以及Bean消亡执行过的拓展接口讲解一遍即可.

可查看依赖spring-beans代码中org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory各方法执行流程辅助理解.

简单版本Bean生命周期图

复杂版本Bean声明周期图

名词解释

BeanDefinition

Bean整个生命周期包括实例化、初始化、销毁操作需要一个对象进行执行,这个对象就是该Bean的BeanDefinition它包含了Bean的元信息.例如该Bean是否懒加载、是否单例、父类路径、自身类路径、初始化方法名称、销毁方法名称等
@Configuration注解标记配置类会被解析为AnnotatedGenericBeanDefinition
@Bean注解标记会被解析为ConfigurationClassBeanDefinition
@Service、@Controller、@Repository 以及 @Component 等注解标记的 Bean 则会被识别为 ScannedGenericBeanDefinition

Bean声明周期经历流程.

实例化前期准备工作(只执行一次)

1. 扫描器加载类信息到Context中
2. 所有BeanDefinition被注册后会执行BeanDefinitionRegistoryPostProcess.postProcessBeanDefinitionRegistory()方法,可在这找到BeanDefinition进行修改(选看,这里可获取到BeanDefinitionRegistory.可进行Bean元数据信息修改)
3. BeanFactory被注册后会执行BeanFactoryPostProcessor.postProcessBeanFactory方法(选看,可获取到BeanFactory)

实例化中工作

4. Bean实例化之前会执行InstantiationAwareBeanPostProcess.postProcessBeforeInstantiation()方法
5. Bean实例化之后会执行InstantiationAwareBeanPostProcess.postProcessAfterInstantiation()方法

实例化后属性赋值工作

属性赋值前会执行MergedBeanDefinitionPostProcessors扫描Bean依赖属性信息加入到BeanDefinition中.用于后续的初始化属性工作,可参考Spring上下文刷新第六步
6. Bean实例化后设置属性后会继续执行InstantiationAwareBeanPostProcess.postProcessProperties方法
7. Bean实例化后设置属性值后会继续执行InstantiationAwareBeanPostProcess.postProcessPropertyValues方法

属性设置完毕后Awear实现Bean全局属性设置操作

8. Bean如果实现了BeanNameAware则会执行setBeanName方法
9. Bean如果实现了BeanFactoryAware则会执行setBeanFactory方法
10. Bean如果实现了ApplicationContextAware则会执行setApplicationContext方法

Bean初始化工作

11. Bean执行初始化之前执行BeanPostProcess.postProcessBeforInitialization方法
12. Bean如果实现了InitializingBean则会执行afterPropertiesSet方法/加了@PostConstruct/指定初始化方法则会执行初始化方法
13. Bean执行初始化之后执行BeanPostProcess.postProcessAfterInitialization方法
执行顺序 @PostConstruct > InitializingBean > init-method

Bean销毁工作

14. 如果Bean实现了DisposableBean/加了@PreDestroy/定义销毁方法,则Bean在销毁前会执行destory方法
执行顺序 @PreDestroy > DisposableBean > destoryMethod

拓展

ApplicationContextAwareProcessor隐藏扩展点,该拓展针对每一个Bean

ApplicationContextAwareProcessor隐藏扩展点

可通过Bean实现该接口来进行一些全局环境配置.
EnvironmentAware:用于设置应用环境参数对象

EmbeddedValueResolverAware:用于获取StringValueResolver的一个扩展类, StringValueResolver用于获取基于String类型的properties的变量,一般我们都用@Value的方式去获取,如果实现了这个Aware接口,把StringValueResolver缓存起来,通过这个类去获取String类型的变量,效果是一样的。

ResourceLoaderAware:用于获取ResourceLoader的一个扩展类,ResourceLoader可以用于获取classpath内所有的资源对象,可以扩展此类来拿到ResourceLoader对象。

ApplicationEventPublisherAware:用于获取EventPublisher来进行事件发布,这里之所以放入applicationContext是因为`AbstractApplicationContext`它实现了该接口,将消息广播出去

MessageSourceAware:用于获取MessageSource的一个扩展类

ApplicationContextAware:用来获取ApplicationContext的一个扩展类,就是spring上下文管理器,可以手动的获取任何在spring上下文注册的bean.同时ApplicationContext也实现了BeanFactory,MessageSource,ApplicationEventPublisher等接口
自定义Bean实例化逻辑

Bean工厂自定义实例化逻辑==FactoryBean==Spring3.0开始该类支持泛型.通过实现该接口制定实例化Bean逻辑(getObject()方法).

参考如下:
面试官:请你说一下 Bean 的生命周期
Springboot启动扩展点超详细总结,再也不怕面试官问了
spring-learn个人学习项目

全部评论

相关推荐

2 34 评论
分享
牛客网
牛客企业服务