Spring Bean的生命周期

Bean的生命周期

BeanFactory的默认实现为DefaultListableBeanFactory,Bean生命周期和方法映射如下

BeanDefinition注册阶段:registerBeanDefinition
BeanDefinition合并阶段:getMergedBeanDefinition

Bean实例化前阶段:resolveBeforeInstantiation
Bean实例化阶段:createBeanInstance
Bean实例化后阶段:populateBean

Bean属性赋值前阶段:populateBean
Bean属性赋值阶段:populateBean

Bean Aware接口回调阶段:initializeBean
Bean初始化前阶段:initializeBean
Bean初始化阶段:initializeBean
Bean初始化后阶段:initializeBean
Bean初始化完成阶段:preInstantiateSingletons

Bean销毁前阶段:destoryBean
Bean销毁阶段:destoryBean

明确概念

Bean的创建过程涉及2个名词
实例化(Instantiation):还没有生成bean
初始化(Initialization):已经生成bean,进行属性赋值

BeanPostProcessor
postProcessBeforeInitialization:初始化前置处理
postProcessAfterInitialization:初始化后置处理

InstantiationAwareBeanPostProcessor(继承自BeanPostProcessor)
postProcessBeforeInstantiation:实例化前置处理(对象未生成)返回不为null,只是放到spring容器中,依赖关系不由spring来处理
postProcessAfterInstantiation:实例化后置处理(对象已生成)
postProcessPropertyValues:修改属性值(对象已生成)

SmartInstantiationAwareBeanPostProcessor(继承自InstantiationAwareBeanPostProcessor)

predictBeanType:预测bean的类型,返回第一个预测成功的Class类型,如果不能预测返回null
determineCandidateConstructors:选择合适的构造器并返回,因为一个类可能有多个构造器
getEarlyBeanReference:获得提前暴露的bean引用。主要解决循环依赖的问题

MergedBeanDefinitionPostProcessor(继承自BeanPostProcessor)
postProcessMergedBeanDefinition:完成对象最基础的实例化工作,对@Autowired和@Value的支持,init方法执行

BeanPostProcessor接口的执行顺序

bean的构造方法
BeanPostProcessor的postProcessBeforeInitialization方法
执行被@PostConstruct修饰的方法
BeanPostProcessor的postProcessAfterInitialization方法

Bean实例化的过程

实例化前阶段

InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
返回不为空的说明,bean已经在这个方法中创建好了,不需要再进行后续的处理了

SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors()
不做特殊处理的话容器中目前有一个(ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor)
返回合适的构造器,默认返回为null

实例化阶段

  1. 如果SmartInstantiationAwareBeanPostProcessor返回了合适的构造器,则用返回的构造函数实例化bean
  2. 使用默认的无参构造函数实例化bean

实例化后阶段

MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition()
解析@Autowired和@Value,为后续的依赖注入作准备

SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference()
getEarlyBeanReference主要用于解决循环引用问题。比如ReferenceA实例内部有ReferenceB的引用,ReferenceB实例内部有ReferenceA的引用。首先先实例化ReferenceA,实例化完成之后提前把这个bean暴露在ObjectFactory中,然后populate属性,这个时候发现需要ReferenceB。然后去实例化ReferenceB,在实例化ReferenceB的时候它需要ReferenceA的实例才能继续,这个时候就会去ObjectFactory中找出了ReferenceA实例,ReferenceB顺利实例化。ReferenceB实例化之后,ReferenceA的populate属性过程也成功完成,注入了ReferenceB实例。提前把这个bean暴露在ObjectFactory中,这个ObjectFactory获取的实例就是通过getEarlyBeanReference方法得到的

InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()
对象已经被实例化,该实例的属性还未被设置,都是null。该方法返回false,会忽略属性值的设置。返回true,会按正常流程设置属性值

InstantiationAwareBeanPostProcessor#postProcessPropertyValues()
当InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()返回true才执行
对属性值进行修改

属性赋值前阶段

属性赋值阶段

Aware接口回调阶段

BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
EnvironmentAware
ResourceLoaderAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationContextAware

初始化前阶段
BeanPostProcessor#postProcessBeforeInitialization()
在Bean初始化之前需要调用的方法

初始化阶段

依次调用如下方法:

  1. @PostConstruct标注方法
  2. 实现InitializingBean接口的afterPropertiesSet()方法
  3. 自定义初始方法

初始化后阶段
在Bean初始化之后需要调用的对象

BeanPostProcessor#postProcessAfterInitialization()

销毁前阶段

销毁阶段

依次调用如下方法:

  1. @PreDestory标注方法
  2. 实现DisposableBean接口的destory()方法
  3. 自定义销毁方法

Spring容器的启动过程

  1. 调用AbstractApplicationContext类的refresh()方法
  2. 准备工厂,解析Configuration类,将类放到bd map中
  3. 处理国际化和初始化事件
  4. 开始实例化单例bean,在8个地方执行了4类后置处理器

Spring Boot的启动过程

原来的spring mvc项目是tomcat扫描web.xml初始化spring容器,现在是在main方法中初始化spring容器,并且创建tomcat环境,将DispatcherServlet注册到tomcat中

Spring AOP的实现过程

动态代理

  1. jdk,基于接口
  2. cglib,基于继承

具体过程

  1. 在配置类上加上@EnableAspectJAutoProxy
  2. 通过@Import一个实现了ImportBeanDefinitionRegistrar接口的类,在BeanDefinitionMap中加入AnnotationAwareAspectJAutoProxyCreator后置处理器
  3. 后置处理器被执行时,返回被代理的对象。被代理的对象已经增加了横切的逻辑

BeanFactory和FactoryBean的区别

  1. BeanFactory是IOC底层容器
  2. FactoryBean是创建bean的一种方式,帮助实现复杂的初始化逻

BeanFactory和ApplicationContext的区别

  1. BeanFactory只是一个IOC容器,没有提供Web,事件发布等功能
  2. ApplicationContext比BeanFactory的功能更丰富,支持国际化, 事件发布等

第一次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation

InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

第二次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors

SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors

第三次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors

MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

第四次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference

SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

第五次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

第六次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

InstantiationAwareBeanPostProcessor#postProcessPropertyValues

第七次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization

BeanPostProcessor#postProcessBeforeInitialization

第八次

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization

BeanPostProcessor#postProcessAfterInitialization

第九次

bean被销毁的时候

BeanPostProcessor贯穿了bean的初始化过程(bean已经new出来,并且完成属性的填充),自动装配

在new出来之前还执行了一些BeanPostProcessor

参考博客

[1]https://mp.weixin.qq.com/s/gBr3UfC1HRcw4U-ZMmtRaQ

欢迎关注

Spring Bean的生命周期_第1张图片

参考博客

循环依赖解决办法
[0]https://juejin.im/post/5c98a7b4f265da60ee12e9b2
好的博客
[0]https://fangjian0423.github.io/2017/06/20/spring-bean-post-processor/
大概流程
[1]https://editor.csdn.net/md?articleId=104781542
名词介绍
[2]https://juejin.im/post/5da995d25188256a49204d7b

你可能感兴趣的:(Spring)