一.Bean 实例化的基本流程
图中看出,在开始加载配置文件时,Spring容器会将每个<bean>标签的配置信息,封装成一个个的BeanDefinition信息对象,然后将每个BeanDefinition信息对象存在一个beanDefinitionMap的Map集合中,Spring框架再对Map集合进行遍历,使用反射创建Bean的实例对象,将创建好的实例对象又放在singletonObjects的Map集合中,最后当我们调用getBean()方法时,会从该Map集合中取出Bean实例对象返回。
二.Spring Bean的生命周期
Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。
SpringBean的生命周期主要包含四个阶段:实例化Bean --> Bean属性赋值 --> 初始化Bean -->销毁Bean
在加载配置文件时,Spring容器将每个配置信息,封装成一个个的BeanDefinition信息对象,然后将每个BeanDefinition信息对象存在一个beanDefinitionMap的Map集合中,在BeanDefinitionMap填充完毕,Bean实例化之前执行Bean工厂后处理器。
工厂后处理器分为BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor两个,其中BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口专门用于注册BeanDefinition操作,BeanFactoryPostProcessor是一个接口规范,实现了该接口的类只要交由Spring容器管理的话,那么 Spring就会回调该接口的方法,用于对BeanDefinition注册和修改的功能。
Bean被实例化后,到最终存到singletonObjects单例池之前,中间会经过Bean的初始化过程。因为Bean创建之后还仅仅是个"半成品",还需要依次对Bean实例的属性进行填充、执行一些Aware 接口方法,在bean中获得相应的Spring容器资源、执行Bean后处理器BeanPostProcessor的前置处理before方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等、执行BeanPostProcessor的后置处理after方法。
经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池 singletonObjects中去了,就可以使用这个Bean,当Bean不再需要时,会进行销毁操作,即完成了Spring Bean的整个生命周期。
Spring在进行属性注入时,会分为如下几种情况: 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去; 注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作; 注入双向对象引用属性时,会出现循环依赖。Spring提供了三级缓存存储完整Bean实例和半成品Bean实例 ,用于解决循环引用问题。
一级缓存:存储实例化和初始化都完成的Bean。(singletonObjects)
二级缓存:缓存半成品对象且当前对象已经被其他对象引用了。(earlySingletonObjects)
三级缓存:缓存半成品对象,对象未被引用,使用时在通过工厂创建Bean。 z(singletonFactories)
Aware接口是一种框架辅助属性注入的一种思想,是处理器的作用,为Bean生命周期各个阶段提供扩展。