【从零学Spring入门到高级】Chapter8~9——Bean的生命周期、循环依赖问题

1.Bean的生命周期探究

1.什么是Bean生命周期

  • Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的销毁等。所谓的生命周期就是:对象从创建开始到最终销毁的整个过程。
  • 什么时候创建Bean对象?
  • 创建Bean对象的前后会调用什么方法?Bean对象什么时候销毁?
  • Bean对象的销毁前后调用什么方法?

2.为什么要知道bean的生命周期?

其实生命周期的本质是:在哪个时间节点上调用了哪个类的哪个方法。我们需要充分的了解在这个生命线上,都有哪些特殊的时间节点。
只有我们知道了特殊的时间节点都在哪,到时我们才可以确定代码写到哪。
我们可能需要在某个特殊的时间点上执行一段特定的代码,这段代码就可以放到这个节点上。当生命线走到这里的时候,自然会被调用。

3.Bean生命周期之5步

Bean生命周期可以粗略的划分为五大步:

  • ·第一步:实例化Bean
  • ·第二步:Bean属性赋值
  • ·第三步:初始化Bean
  • ·第四步:使用Bean
  • ·第五步:销毁Bean

 

 

spring配置文件配置User,然后测试

 

 

 

 4.Bean的生命周期之7步 

在以上的5步中,第3步是初始化Bean,如果你还想在初始化前和初始化后添加代码,可以加入“Bean后处理器”。编写—个类实现BeanPostProcessor类,并且重写before和after方法。

 

 

 5.Bean的生命周期之10步

 

 

 Aware相关的接口包括: BeanNameAware、BeanClassLoaderAware、BeanFactoryAware

  • ·当Bean实现了BeanNameAware,Spring会将Bean的名字传递给Bean。
  • ·当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean,
  • ·当Bean实现了BeanFactoryAware,Spring会将Bean工厂对象传递给Bean。

 实现Aware相关接口需要重写以下三个方法: 

 实现InitializingBean,重写:

 实现DisposableBean,重写:

 6.Bean的作用域不同,管理方式不同

Spring根据Bean的作用域来选择管理方式。

  • ·对于singleton作用域的Bean,Spring 能够精确地知道该Bean何时被创建,何时初始化完成,以及何时被销毁;
  • ·而对于prototype作用域的Bean,Spring只负责创健,当容器创建了Bean的实例后,Bean的实例就交给客户端代码管理,Spring容器将不再跟踪其生命周期。(负责到   使用Bean 这一步)

7.自己new的对象如何让spring管理

 

2.Bean的循环依赖 

1.什么是Bean的循环依赖?

set单例模式下: 

 

 

 set多例:

报错:创建中异常

 注意:当两个bean 的scope都足prototype的时候,才会出现异常。如果其中任意一个是singleton的,就不会出现异常。

构造方式

 3.Spring解决循环依赖的机理

Spring为什么可以解决set + singleton模式下循环依赖?
根本的原因在于:这种方式可以做到将“实例化Bean”和“给Bean属性赋值”这两个动作分开去完成。
实例化Bean的时候:调用无参数构造方法来完成。此时可以先不给属性赋值,可以提前将该Bean对象“曝光”给外界。给Bean属性赋值的时候:调用setter方法来完成。
两个步骤是完全可以分离开去完成的,并且这两步不要求在同一个时间点上完成。
也就是说,Bean都是单例的,我们可以先把所有的单例Bean实例化出来,放到一个集合当中(我们门可以称之为缓存),所有的单例Bean全部实例化完成之后,以后我们再慢慢的调用setter方法给属性赋值。这样就解决了循环依赖的问题。
源码:

 

 断点调试:

 (这块读源码,有点怵,不是很懂,先跳了)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VIXeH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值