本文编写于 1319 天前,最后修改于 1307 天前,其中某些信息可能已经过时。
Spring Bean生命周期
调用 getBean(name) 方法来加载name对应的单例对象,这里只分析Spring的单例对象生命周期。
- 转换并解析bean的名称,处理bean别名,获取到真正的bean名称;
- 如果beanName是以
&开头的,就返回FactoryBean的工厂对象本身; - 如果获取的是以
FactoryBean工厂自定义创建的实例对象,那么就通过FactoryBean的getObject方法来创建单例对象; 从缓存中获取单例bean;
- 先从单例缓存(一级缓存
singletonObjects)中获取; - 如果一级获取不到,则判断当前bean是否正在创建,如果当前bean正在创建,则从早期单例缓存(二级缓存
earlySingletonObjects)中获取; - 如果二级缓存获取不到,则判断当前容器是否允许早期引用,如果允许早期引用,则从对象工厂缓存(三级缓存
singletonFactories)获取bean的对象工厂ObjectFactory; - 调用
ObjectFactory的getObject方法创建早期单例bean,并将早期单例添加到早期单例缓存(二级缓存earlySingletonObjects)中。
- 先从单例缓存(一级缓存
如果成功获取到单例bean,先尝试通过
FactoryBean来实例化bean;- 判断name是否以
&开头,如果单例bean是FactoryBean实例,返回单例bean; - 判断单例是否是
FactoryBean的实例,调用FactoryBean的getObject方法创建单例bean,返回单例bean。
- 判断name是否以
- 未获取到单例bean,开始创建单例bean;
- 检查当前是否存在
prototy类型的bean正在创建(prototy类型的bean无法解决循环依赖的问题); - 标记
beanName对应的bean开始创建; - 获取bean的
BeanDefinition并封装为RootBeanDifition(RootBeanDifition包含父类Bean的定义信息); - 注册并提前初始化bean依赖的那些bean;
- 提供一个扩展点,通过后置处理器
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法创建并返回一个代理对象,结束创建流程; - 记录beanName对应的bean开始创建;
正式创建单例bean;
- 解析
BeanDifinition中bean属性class; - 在
BeanDifinition中预先标记没有重载的方法; - 通过反射创建bean的实例;
- 将bean的实例封装到
BeanWrapperImpl中; - 通过后置处理器
MergedBeanDefinitionPostProcessor的方法postProcessMergedBeanDefinition用来合并一些信息到BeanDefinition,例如将添加了@Autoired、@Resource等注解信息加入到BeanDefinition中,默认的处理器有:CommonAnnotationBeanPostProcessor、AutowiredAnnotationBeanPostProcessor、InitDestroyAnnotationBeanPostProcessor等; - 当前bean为单例,设置允许循环且bean正在创建;
- 添加创建早期单例bean的对象工厂
ObjectFactory到三级缓存中(对象工厂缓存singleFactories); - 调用后置处理器
InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法来去修改bean的状态,如果该方法返回false,将会跳过步骤9及步骤10(即为bean填充各种属性值); - 通过后置处理器
InstantiationAwareBeanPostProcessor的postProcessProperties方法处理bean属性值的扩展点,其中AutowiredAnnotationBeanPostProcessor后置处理器用于处理带有@Autowired和@Value注解的字段,利用反射API来完成属性值的注入; - 为bean填充各种属性值;
- 调用感知接口的方法(即相关Aware接口),为bean注入容器中的内置对象;
- 在bean初始化之前通过后置处理器
BeanPostProcessor的postProcessBeforeInitialization方法调整bean; - 通过后置处理器
InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization方法来执行@PostConstruct注解标注的初始化方法; 执行bean中的初始化方法:
- 先判断bean是否实现
InitializingBean接口,如果实现则执行afterPropertiesSet方法; - 执行初始化方法
init-method中指定的方法;
- 先判断bean是否实现
- 在bean初始化之后通过后置处理器
BeanPostProcessor的postProcessAfterInitialization方法调整bean,其中后置处理器AnnotationAwareAspectJAutoProxyCreator在其抽象父类的父类的父类AbstractAutoProxyCreator中的postProcessAfterInitialization方法中实现了AOP功能; 注册
DisponsableBeanAdapter在销毁bean时执行方法:- 先调用后置处理器
DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法来执行bean的销毁处理,默认的后置处理器InitDestroyAnnotationBeanPostProcessor的postProcessBeforeDestruction方法用来执行@PreDestroy注解标注的销毁方法; - 先判断bean是否实现
DisponsableBean接口,如果实现则执行destroy方法; - 执行销毁方法
destory-mehtod中指定的方法;
- 先调用后置处理器
- 解析
- 如果是首次创建实例bean,需要将创建好的实例bean添加到单例缓存(一级缓存
singletonObjects)中,删除对象工厂缓存(三级缓存singletonFactories)和早期单例缓存(二级缓存earlySingletonObjects)中对应的缓存。并在registeredSingletons中记录已经创建过的bean名称, 防止单例bean的重复创建; - 检查是否需要转换对象的类型。