Bean的生命周期

本文详细阐述了Spring框架中Bean的生命周期过程,包括初始化、属性填充、Aware方法执行、BeanPostProcessor处理、实例化、注册销毁以及源码定位。重点关注了关键步骤和对应的方法实现。
摘要由CSDN通过智能技术生成

兄弟们,今天我们来看一下Spring面试题中的一个经典考点:Spring中Bean的生命周期。本文会先介绍Bean生命周期的各个阶段,并点出各个阶段重点做了哪些事情。随后会找到各个生命周期对应的源码位置。

生命周期流程

image.png

  1. 初始化阶段:创建Bean对象,通过反射或工厂方法
  2. 填充属性阶段@Value@Autowired@Resource等注解标注的属性,在此阶段完成属性设置
  • AutowiredAnnotationBeanPostProcessor:用于解析@Value@Autowired
  • CommonAnnotationBeanPostProcessor:用于解析@Resource
  1. 执行Aware方法BeanNameAwareBeanFactoryAware等实现方法开始执行

ApplicationContextAwareApplicationEventPublisherAware等接口,虽然也是Aware,但是它们是通过ApplicationContextAwareProcessor执行postProcessBeforeInitialization才执行的

  1. 执行**BeanPostProcessor**实例化前方法:执行BeanPostProcessor#postProcessBeforeInitialization
  • ApplicationContextAwareProcessor:执行部分Aware接口的实现方法
  • CommonAnnotationBeanPostProcessor@PostConstruct标注的方法执行
  1. 执行实例化方法

实例化方法有3种定义方式:

  • @PostConstruct:在第4步中,通过CommonAnnotationBeanPostProcessor#postProcessBeforeInitialization执行
  • InitializingBean实现方法执行
  • init-method方法执行

执行顺序:@PostConstruct>InitializingBean>init-method

  1. 执行**BeanPostProcessor**实例化后方法BeanPostProcessor#postProcessAfterInitialization
  • ApplicationListenerDetector:将实现ApplicationListener的Bean添加到Spring应用上下文的ApplicationListener列表
  • AnnotationAwareAspectJAutoProxyCreator:AOP代理对象的创建
  1. 注册可销毁的Bean

判断依据,首先不能是原型Bean,此外需要满足下面3个条件之一

  • 实现了DisposableBean
  • 定义了destroy方法
  • DestructionAwareBeanPostProcessor可以处理
  1. Bean的使用
  2. 执行**DestructionAwareBeanPostProcessor**销毁前方法:执行DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
  • ApplicationListenerDetector:若销毁的Bean实现了ApplicationListener,从Spring应用上下文的ApplicationListener列表移除
  • CommonAnnotationBeanPostProcessor:执行@PreDestroy标注的方法
  1. 执行销毁方法

销毁方法有3种定义方式:

  • @PreDestroy:在第9步中,通过CommonAnnotationBeanPostProcessor#postProcessBeforeDestruction执行
  • DisposableBean实现方法
  • destroy方法执行

执行顺序:@PreDestroy>DisposableBean>destroy

源码定位

生命周期的对应代码位置,大家可以定位下面的方法
AbstractAutowireCapableBeanFactory#doCreateBean

整体概览

image.png

初始化

image.png

初始化阶段也涉及不少逻辑,构造器推断等,不展开讲

填充属性

image.png

下面给大家Debug看下有哪些(SpringBoot2.7)

image.png

实例化Bean

image.png

执行Aware方法

image.png

执行BeanPostProcessor实例化前方法

image.png
image.png

执行实例化方法

image.png

执行BeanPostProcessor实例化后方法

image.png

注册可销毁的Bean

image.png

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值