Spring生命周期与扩展点(图)
Bean的生命周期有两个主要方面,一是生命周期的主要阶段(绿色),一是扩展点(粉色、橘黄色)(用于在生命周期的某个阶段进行自定义扩展)
生命周期
Bean的生命周期本质上就是一系列方法的调用执行,把它划分为四个主要阶段是为了方便我们理解。在Bean被创建完成可供使用前,需要经历实例化、属性赋值、初始化三个重要阶段。当Bean不再需要时,会经过销毁阶段。
- 实例化 (Instantiation): 由Spring完成,通过反射"new"出Bean对象
- 属性赋值(Populate): 由Spring完成,对Bean的属性进行依赖注入
- 初始化(Initialization): 自己实现-通过Bean实现
InitializingBean接口
的AfterPropertiesSet()
方法 - 销毁(Destruction):自己实现-通过Bean实现
DisposableBean接口
的destroy
方法
扩展点(钩子函数)
所谓扩展点(钩子函数),就是一些特定接口内的特定方法,Spring在创建Bean时,执行到某个阶段就会调用这些特定方法,来完成一些自定义的功能。也就是说,扩展点是可选的执行方法如果有这样的方法,就会在响应阶段调用执行,没有也不会影响整个流程。
生命周期扩展点
如图中绿色的部分,被本文称作主要阶段,主要阶段中的前两阶段 实例化 (Instantiation)和属性赋值(Populate)是Spring帮我们完成的。主要阶段的后两部分初始化(Initialization)和销毁(Destruction)需要我们自己完成。
初始化(Initialization):
两种方式:
- 通过Bean实现
InitializingBean接口
的AfterPropertiesSet()
方法 或 - 在配置文件中指定
init-method
<bean name = "yy" class = "yy.yy" init-method="init">
......
</bean>
销毁(Destruction):
两种方式:
- 通过Bean实现
DisposableBean接口
的destroy
方法 - 在配置文件中指定
destroy-method
<bean name = "yy" class = "yy.yy" destroy-method="destroy">
......
</bean>
Aware类型扩展点
Aware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源。基本都能够见名知意,Aware之前的名字就是可以拿到什么资源,例如BeanNameAware接口的setBeanName
可以拿到BeanName,以此类推。
xxxAware接口都是在属性赋值阶段之后,初始化阶段开始之前执行。
简单举例:
方法的参数就是我们想拿到的资源,会以参数形式传递进来。
@Component
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("MyBeanName-setBeanName:"+name);
}
}
容器级扩展点
包括了InstantiationAwareBeanPostProcessor
和BeanPostProcessor
这两个接口实现,一般称它们的实现类为“后处理器”。
对于ApplicatonContext
(IOC容器)来说,容器可以自动检测并加载BeanPostProcessor
和BeanFactoryPostProcessor
的实现类,它们将影响所有Bean的创建过程。而之前的扩展点(非容器级)只会影响自身Bean的创建过程。
BeanPostProcessor接口
postProcessBeforeInitialization():执行于初始化之前
postProcessAfterInitialization():执行于初始化之后
InstantiationAwareBeanPostProcessor接口
postProcessBeforeInstantiationn():执行于实例化之前
postProcessAfterInstantiation():执行于实例化之后
InstantiationAwareBeanPostProcessor接口继承自BeanPostProcessor接口
总结
Spring生命周期分为4个重要阶段 实例化 (Instantiation)、属性赋值(Populate)、初始化(Initialization)、销毁(Destruction)。
其中实例化 (Instantiation)、属性赋值(Populate)是Spring帮我们完成的。
初始化(Initialization)、销毁(Destruction)我们是通过生命周期扩展点自己实现的。
另外还有Aware类型扩展点帮助我们能够拿到Spring容器中的一些资源,它发生在属性赋值之后,初始化之前。
以及容器级扩展点对所有Bean产生影响,InstantiationAwareBeanPostProcessor
作用于实例化前后,BeanPostProcessor
作用于初始化前后。