3、Spring Bean生命周期

Spring Bean的生命周期只有四个阶段,每个阶段又有对应的扩展点,如下:

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction

实例化 -> 属性赋值 -> 初始化 -> 销毁。

主要逻辑都在doCreateBean()方法中,逻辑很清晰,就是顺序调用以下三个方法,这三个方法与三个生命周期阶段一一对应,非常重要,在后续扩展接口分析中也会涉及。

createBeanInstance() -> 实例化
populateBean() -> 属性赋值
initializeBean() -> 初始化

3、Spring Bean生命周期_第1张图片
至于销毁,是在容器关闭时调用的,详见ConfigurableApplicationContext#close()。

常用扩展点
第一类:影响多个Bean的接口
实现了这些接口的Bean会切入到多个Bean的生命周期中。正因为如此,这些接口的功能非常强大,Spring内部扩展也经常使用这些接口,例如自动注入以及AOP的实现都和他们有关。

  1. BeanPostProcessor
  2. InstantiationAwareBeanPostProcessor

Spring扩展中最重要的两个接口!
InstantiationAwareBeanPostProcessor作用于实例化阶段的前后,BeanPostProcessor作用于初始化阶段的前后。正好和第一、第三个生命周期阶段对应。

InstantiationAwareBeanPostProcessor实际上继承了BeanPostProcessor接口。

3、Spring Bean生命周期_第2张图片
InstantiationAwareBeanPostProcessor源码分析
postProcessBeforeInstantiation调用点
3、Spring Bean生命周期_第3张图片
postProcessAfterInstantiation调用点
3、Spring Bean生命周期_第4张图片
可以看到该方法在属性赋值方法内,但是在真正执行赋值操作之前。其返回值为boolean,返回false时可以阻断属性赋值阶段(continueWithPropertyPopulation = false)。

关于BeanPostProcessor执行阶段的源码穿插在下文Aware接口的调用时机分析中,因为部分Aware功能的就是通过他实现的!只需要先记住BeanPostProcessor在初始化前后调用就可以了。

第二类:只调用一次的接口,影响单个Bean
常用于用户自定义扩展。

  1. Aware类型的接口
  2. 生命周期接口

Aware
Aware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源。基本都能够见名知意,Aware之前的名字就是可以拿到什么资源,例如BeanNameAware可以拿到BeanName,以此类推。调用时机需要注意:所有的Aware方法都是在初始化阶段之前调用的。

Aware接口具体可以分为两组,至于为什么这么分,详见下面的源码分析。如下排列顺序同样也是Aware接口的执行顺序,能够见名知意的接口不再解释。

Aware Group1

  1. BeanNameAware
  2. BeanClassLoaderAware
  3. BeanFactoryAware

Aware Group2

  1. EnvironmentAware
  2. EmbeddedValueResolverAware 这个知道的人可能不多,实现该接口能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可以使用,非常方便
  3. ApplicationContextAware返回当前的ApplicationContext对象

Aware接口调用时机源码分析
3、Spring Bean生命周期_第5张图片
可以看到并不是所有的Aware接口都使用同样的方式调用。Bean××xAware都是在代码中直接调用的,而ApplicationContext相关的Aware都是通过BeanPostProcessor#postProcessBeforeInitialization()实现的。

两个生命周期接口
InitializingBean:实现自己的初始化方法,也可以使用
DisposableBean :实现自己的销毁方法,也可以使用

默认的初始化和销毁方法

BeanPostProcessor 注册时机与执行顺序
注册时机
refresh方法
3、Spring Bean生命周期_第6张图片
可以看出,Spring是先执行registerBeanPostProcessors()进行BeanPostProcessors的注册,然后再执行finishBeanFactoryInitialization初始化我们的单例非懒加载的Bean。

执行顺序
BeanPostProcessor有很多个,而且每个BeanPostProcessor都影响多个Bean,其执行顺序至关重要,必须能够控制其执行顺序才行。关于执行顺序这里需要引入两个排序相关的接口:PriorityOrdered、Ordered

优先级:PriorityOrdered -> Ordered -> 没有任何实现
多个PriorityOrdered或Ordered再通过接口返回值排序,默认升序排序,返回值越低优先级越高。
3、Spring Bean生命周期_第7张图片
3、Spring Bean生命周期_第8张图片
PriorityOrdered、Ordered接口作为Spring整个框架通用的排序接口,在Spring中应用广泛,也是非常重要的接口。

你可能感兴趣的:(Spring)