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生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Spring--SpringBean作用域

Spring--SpringBean作用域

drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求解析渲染响应异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中(代码片

Java连载104-线程的生命周期命名与获取

Linux 内核进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 )

Fragment创建及其生命周期