springboot-Bean的生命周期以及循环依赖--面试

本文详细阐述了Spring框架中Bean的生命周期过程,包括创建、初始化、使用和销毁阶段,以及如何处理依赖注入和循环依赖问题,主要通过DefaultSingletoonBeanRegistry中的缓冲区机制来确保正确执行。
摘要由CSDN通过智能技术生成
Bean的生命周期
  • 创建对象
    • 实例化(构造方法)
    • 依赖注入
  • 初始化
    • 执行Aware接口回调
    • 执行BeanPostProcessor,postProcessBeforeInitilization
    • 执行InitilizingBean回调(先执行@PostConstruct)
    • 执行BeanPostProessor,postProcessAfterInitilization
  • 使用对象
  • 销毁对象
    • 执行DisposableBean回调(先执行@PreDestory)

Bean的生命周期总的来说有四个阶段,分别有创建对象,初始化对象,使用对象以及销毁对象,而且这些大部分工作是交给Bean工厂的doCreateBean方法完成的

  • 首先在创建对象阶段,先调用构造方法实例化对象,对象有了后会填充该对象的内容,其实就是处理依赖注入
  • 其次,在对象创建完毕后,需要做一些初始化的操作,这里涉及到几个拓展点
    • 执行Aware接口回调
    • 执行Bean后置处理器的postProcessBeforeInitilization方法
    • 执行InitilizingBean回调,这一步如果Bean中标注了@PostConstruct注解的方法,会先执行他
    • 执行BeanPostProessor的postProcessAfterInitilization
  • 接下来,使用阶段就是程序员从容器中获取Bean使用即可
  • 最后,在容器销毁之前,会先销毁对象,此时会执行DisposableBean接口的回调,这一步如果Bean中有标注了@PreDestory接口的函数,会先执行它

总结一下,Bean的生命周期包含四个阶段,其中初始化对象和销毁对象程序员可以通过一些拓展点执行自己的代码。

Bean循环依赖

Bean的循环依赖是指A依赖于B,B又依赖于A这样的闭环依赖问题,在spring中,通过三个对象缓存区来解决循环依赖问题,这三个缓存区被定义到了DefaultSingletoonBeanRegistry中,分别是singletonObejcts用来存储创建完毕的Bean,earlySingletonObjects用来存储未完成依赖注入的Bean,还有SingletonFactories用来储存创建Bean的ObjectFactory。假如现在A依赖B,B依赖A,整个创建的过程是这样的

  • 首先,调用A的构造方法实例化A,当前的A还没有处理依赖注入,暂且把它称为半成品,此时会把半成品A封装到一个ObjectFactory中,并存储到springFactories缓冲区
  • 接下来,要处理A的依赖注入了,由于此时还没有B,所以得先实例化一个B,同样的,半成品B也会被封装到ObjectFactory中,并存储到springFactories缓冲区
  • 紧接着就要处理B的依赖注入了,此时会找到springFactories中A对应得ObjectFactory,调用它得getObject方法得到刚才实例化的半成品A(如果需要代理对象,则会自动创建代理对象,将来得到的就是代理对象),把得到的半成品A注入给B,并同时会把半成品的A存入到earlySingletonObjects中,将来如果还有其他的类循环依赖了A,就可以直接从earlySingletonObjects中找到它了,那么此时springFactories中创建A的ObjectFactory也可以删除了
  • 至此,B的依赖注入处理完了后,B就创建完毕了,就可以把B的对象存储到singletonObejcts中了,并同时删除掉SpringFactories中创建B的ObjectFactory
  • B创建完毕后,就可以继续处理A的依赖注入了,把B注入给A,此时A也创建完毕了,就可以把A的对象存储到singletonObejcts中了,同时删除掉earlySingletonObjects中的半成品A
  • 截此为止,A和B的对象全部创建完毕,并存储到了singletonObejcts中,将来通过容器获取对象,都是从singletonObejcts中获取

总结起来就是,借助于DefaultSingletoonBeanRegistry中的三个缓冲区可以解决循环依赖问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值