目录
BeanDefinition存储到一个名为beanDefinitionMap的集合中
解析出来的Bean实例对象存储在一个名为singletonObjects的Map集合中
前言
在Spring中,我们将对象交给框架来管理,由IOC容器来负责对象的创建与管理。Spring中Bean的生命周期是指从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整的对象,最终存储到单例池中,随后到使用、销毁,这个过程被称为Bean的生命周期。Bean的生命周期大体分为以下几个阶段:
- Bean的实例化阶段
- Bean的初始化阶段
- Bean的完成阶段
- Bean的使用、销毁
Bean的实例化流程
- Spring容器在初始化时,会读取解析xml,或者注解的配置信息并将其封装成一个个BeanDefinition对象
- 将所有的BeanDefinition对象存储到一个名为beanDefinitionMap的Map集合当中
- Spring容器底层对该Map集合进行遍历,使用反射创建Bean的实例对象
- 创建好的Bean再存储到名为singletonObjects的Map集合中
- 当我们调用getBean()方法时,则从该Map集合中取出Bean的实例对象并返回
-
Bean信息定义对象-Definition
-
BeanDefinition存储到一个名为beanDefinitionMap的集合中
-
解析出来的Bean实例对象存储在一个名为singletonObjects的Map集合中
Bean的生命周期
1.Bean的实例化阶段
Spring框架会取出BeanDefinition的信息进行判断当前Bean范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化 。
2.Bean的初始化阶段
Bean创建之后还仅仅是个“半成品”,还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具有技术含量和复杂度的阶段。
a.Bean实例的属性填充
BeanDefinition中有对当前Bean实体的注入信息通过属性propertyValues存储 ,如图:
Spring在进行属性注入时,会分为以下几种情况:
- 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去 ;
- 注入单向对象引用属性时,从容器中getBean获取后通过set 方法反射设置进去,如果容器中没有,则先创建被注入对象Bean的实例(完成整个生命周期)后,再进行注入操作 ;
- 注入双向对象引用属性,比较复杂,可能出现循环引用(循环依赖),Spring使用三级缓存来解决此问题
b.Aware接口属性注入
Aware接口是一种框架辅助属性注入的一种思想,其他框架中也可以看到类似的接口。框架具备高度封装性,我们接 触到的一般都是业务代码,一个底层功能API不能轻易的获取到,但是这不意味着永远用不到这些对象,如果用到了 ,就可以使用框架提供的类似Aware的接口,让框架给我们注入该对象;
Aware接口发挥处理器的作用,为Bean生命周期各个阶段提供扩展 ,Aware有以下子接口:
Aware接口 | 回调方法 | 作用 |
---|---|---|
ServletContextAware | setServletContext(ServletContext context) | Spring框架回调方法注入ServletContext对象,web环境下才生效 |
BeanFactoryAware | setBeanFactory(Beanfactory factory) | Spring回调方法注入beanFactory对象 |
BeanNameAware | setBeanName(String beanName) | Spring框架回调方法注入当前Bean在容器中的beanName |
ApplicationContextAware | setApplicationContext(ApplicationContext applicationContext) | Spring框架回调方法注入applicationContext对象 |
c.BeanPostProcessor的before方法回调:调用后工厂处理器的before()方法
d.InitializingBean接口的初始化方法回调 :调用系统接口的初始化方法
e.自定义初始化方法init回调 :调用自定义的初始化方法
f.BeanPostProcessor的after()方法回调 :调用后工厂处理器的after()方法
3.Bean的完成阶段
经过初始化阶段,Bean就成为了一个完整的SpringBean,被存储到单例池singletonObjects中去。
4.Bean的使用和销毁
调用getBean方法取出实例好的Bean来使用,到最后销毁。