1 概述
本文详解 Spring Bean 的生命周期,具体是通过 Spring 的 IOC 容器在启动过程中,以及 Bean 的创建,配置,以及销毁的过程中的一些回调接口来验证的。具体包含以下内容:
- Spring Bean 的生命周期流程图
- 实现相关接口的 Bean 并注册到 Spring IOC 容器,容器在启动后会自动调用自定义 Bean 中的方法
- 自定义 Bean 实现了这些声明周期的回调接口能做些什么,这里结合 BeanFactoryPostProcessor 实现了一个基于订单处理的策略设计模式
2 Spring Bean 的生命周期流程图
Spring Bean 的完整生命周期从创建 Spring 容器开始,直到最终 Spring 容器销毁 Bean,这其中包含了一系列回调方法。具体如下
3 各种接口方法分类
Bean 的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
- Bean 自身的方法: 这个包括了 Bean 本身调用的方法和通过
@PostConstruct
和@PreDestroy
指定的方法 - Bean 级生命周期接口方法: 这个包括了 BeanNameAware、BeanFactoryAware、InitializingBean 和 DiposableBean 这些接口的方法
- 容器级生命周期接口方法: 这个包括了 InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。
- 工厂后处理器接口方法: 这个包括了 AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer 等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
4 验证
4.1 Bean 自身的方法
- TestBeanMethod 自身实现了 BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean 这四个接口,并通过
@PostConstruct
和@PreDestroy
指定了初始化后以及销毁前的方法,具体如下
1 | import org.slf4j.Logger; |
4.2 实现 BeanPostProcessor 接口
- TestBeanPostProcessor
BeanPostProcessor 接口包括 2个方法 postProcessAfterInitialization 和 postProcessBeforeInitialization,这两个方法的第一个参数都是要处理的 Bean 对象,第二个参数都是 Bean 的 name。返回值也都是要处理的Bean对象。
1 | import org.slf4j.Logger; |
4.3 实现 InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor 接口本质是 BeanPostProcessor 的子接口,一般继承 Spring 为其提供的适配器类 InstantiationAwareBeanPostProcessor Adapter 来使用它,如下
1 | import org.slf4j.Logger; |
4.4 实现 BeanFactoryPostProcessor 接口
1 | import org.slf4j.Logger; |
- 通过 AnnotationConfigApplicationContext 启动和销毁 Spring 容器,具体如下
1 | import com.toulezu.test.component.TestBeanMethod; |
- 输出如下
1 | 15:59:09.654 [main] INFO c.t.t.c.TestBeanFactoryPostProcessor - 这是 BeanFactoryPostProcessor 实现类构造器!! |
5 使用场景
这里结合策略设计模式 和 BeanFactoryPostProcessor 的实现类,来处理一个根据 不同的订单类型 使用 不同的处理器功能。
好处如下:
- 订单类型的处理 通过 订单类型注解(OrderHandlerType)和实现 AbstractOrderHandler 接口就可以扩展,实现了“高内聚和低耦合”。
- 取消了
if...else if...
,代码容易阅读和理解。
5.1 订单处理注解
订单处理注解,用于标注订单的处理类型,具体如下
1 | import com.ckjava.test.entity.OrderTypeEnum; |
5.2 实现 BeanFactoryPostProcessor 接口
- 实现 BeanFactoryPostProcessor 接口,用于在 Spring 容器启动成功后从容器中获取 AbstractOrderHandler 接口的实现类
- 并将实现类存入到 订单处理容器中
具体如下
1 | import com.ckjava.test.annotation.OrderHandlerType; |
5.3 订单的实体和订单类型枚举
- OrderEntity
1 | import java.math.BigDecimal; |
- OrderTypeEnum
1 | /** |
5.4 订单处理接口
- 订单处理接口
1 | import com.ckjava.test.entity.OrderEntity; |
5.5 订单处理容器
订单处理容器,根据订单类型返回对应的 订单处理器
1 | import com.ckjava.test.annotation.OrderHandlerType; |
5.6 具体的订单处理器
- 处理线下订单, 带有
@OrderHandlerType(OrderTypeEnum.offline)
注解
1 | import com.ckjava.test.annotation.OrderHandlerType; |
- 处理线上订单,带有
@OrderHandlerType(OrderTypeEnum.online)
注解
1 | import com.ckjava.test.annotation.OrderHandlerType; |
5.7 测试
1 | import com.ckjava.test.entity.OrderEntity; |
- 输出如下
1 | 21:51:31.944 [main] INFO c.c.t.h.ProcessOfflineOrderHandler - order handler,type=offline |