流程分明的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)
实例化中工作
  1. Bean实例化之前会执行InstantiationAwareBeanPostProcess.postProcessBeforeInstantiation()方法
  2. Bean实例化之后会执行InstantiationAwareBeanPostProcess.postProcessAfterInstantiation()方法
实例化后属性赋值工作

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

属性设置完毕后Awear实现Bean全局属性设置操作
  1. Bean如果实现了BeanNameAware则会执行setBeanName方法
  2. Bean如果实现了BeanFactoryAware则会执行setBeanFactory方法
  3. Bean如果实现了ApplicationContextAware则会执行setApplicationContext方法
Bean初始化工作
  1. Bean执行初始化之前执行BeanPostProcess.postProcessBeforInitialization方法
  2. Bean如果实现了InitializingBean则会执行afterPropertiesSet方法/加了@PostConstruct/指定初始化方法则会执行初始化方法
  3. Bean执行初始化之后执行BeanPostProcess.postProcessAfterInitialization方法
    执行顺序 @PostConstruct > InitializingBean > init-method
Bean销毁工作
  1. 如果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工厂自定义实例化逻辑FactoryBeanSpring3.0开始该类支持泛型.通过实现该接口制定实例化Bean逻辑(getObject()方法).

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值