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方法给属性赋值。这样就解决了循环依赖的问题。
源码:
断点调试:
(这块读源码,有点怵,不是很懂,先跳了)