Spring--SpringBean生命周期
Posted jazon@
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring--SpringBean生命周期相关的知识,希望对你有一定的参考价值。
Spring Bean元信息配置阶段
- BeanDefinition配置: 面向资源: XML配置,Properties资源配置。面向注解;面向API
SpringBean元信息解析阶段
- 面向资源BeanDefinition解析: 1.BeanDefinitionReader。2.XML解析器 BeanDefinitionParser。
- 面向注解BeanDefinition解析: 1.AnnotatedBeanDefinitionReader
Spring Bean注册阶段
- BeanDefinition注册接口: 1.BeanDefinitionRegistry
Spring BeanDefinition合并阶段
- BeanDefinition合并,父子BeanDefinition合并: 1.当前BeanFactoryu查找。2.层次性BeanFactory查找。
Spring Bean Class加载阶段
- ClassLoader类加载
Spring Bean实例化前阶段
- 非主流生命周期-Bean实例化前阶段: InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation,如果这个方法返回了对象,则会使用它作为bean。如果返回null,则由Spring去实例化。这个可用于bean的拦截。
Spring Bean实例化阶段
- 找到合适的构造器,生成对应的bean。此时还未给属性赋值,只是根据构造器生成了bean。
Spring Bean实例化后阶段
- Bean是否进行属性赋值判断,InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation,如果返回false,则Spring不会对该bean进行属性赋值。
Spring Bean属性赋值前阶段
当Bean实例化之后,需要对属性进行赋值,赋值前有个回调方法,可以对propertyValues进行修改,Spring会将修改后的propertyValues赋值进bean中。
- Bean属性值元信息: PropertyValues
- Bean属性复制前回调: InstantiationAwareBeanPostProcessor#postProcessPropertyValues。Spring5.1: InstantiationAwareBeanPostProcessor#postProcessProperties。
Spring Bean Aware接口回调阶段
aware接口并不是对所有bean的处理,而是哪个bean实现了aware接口,就会在该bean生成后进行进行回调,比如实现了BeanNameAware接口的类,在该类实例化后,会调用它的setBeanName方法。而BeanPostProcessor是对所有bean的一个拦截,即任意bean的生命周期都会调用BeanPostProcessor。下面是ware接口的回调顺序,除了前三个,其他的都是用ApplicationAwareContextProcessor#postProcessBeforeInitialization进行实现的,注意是initialization不是Instantiation,前者是初始化,后者是实例化。
Spring Bean初始化前阶段
- BeanPostProcessor#postProcessBeforeInitialization
Spring Bean初始化阶段
- Bean初始化: 1.@PostConstruct标注方法,底层也是依赖BeanPostProcessor#postProcessBeforeInitialization,多个beanPostProcessor的postProcessBeforeInitiallization调用顺序取决于beanPostProcessor的顺序2.实现InitializingBean接口的afterPropertiesSet()方法。3.自定义初始化方法,即指定init方法
Spring Bean初始化后阶段
- 方法回调,BeanPostProcessor#postProcessAfterInitialization
Spring Bean初始化完成阶段
在ApplicationContext中显式执行beanFactory.preInstantiateSingletons(),这个方法会将所有的beanDefinition初始化为bean,当所有bean初始化完成后,会调用实现了SmarInitializingSingleton#afterSingletonsInstantiated方法,所以这个方法是初始化完成阶段。
- SmartInitializingSingleton#afterSingletonsInstantiated
Spring Bean销毁前阶段
- DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
Spring Bean销毁阶段
- Bean销毁,1.
@PreDestroy
标注方法,实现原理也是通过BeanPostProcessor#postProcessBeforeDestruction,和自定义BeanPostProcessor顺序取决于beanPostProcessor的顺序。2.实现DisposableBean接口的destroy()方法。3.自定义销毁方法即destroy指定的方法。
以上是关于Spring--SpringBean生命周期的主要内容,如果未能解决你的问题,请参考以下文章