网站首页 > 精选教程 正文
《Spring6》第18节:Bean的生命周期接口之多个BeanPostProcessor执行顺序
前面10几个小节的内容,已经将Spring中的依赖注入、自动装配、Bean标签相关属性都已经介绍完了,这里我们就继续学习Spring生命周期相关的内容。在之前的文章里面,虽然也有提到生命周期这个概念,但是都是简单的一笔带过,并没有深入的介绍,从这篇文章开始,我将专门来介绍一下Bean的生命周期中涉及到的几个常见接口。
在Spring的生命周期里面,提供了很多个以Aware结尾的接口,这些接口的作用是为了让程序开发人员可以自定义扩展一些Bean功能。需要注意的是,这些Aware接口是在Bean对象属性赋值完成之后才会被调用,Spring中具体提供了哪些Aware接口,可以查看下面的文档地址:
Aware接口文档地址:【
https://docs.spring.io/spring-framework/docs/6.0.0-M3/reference/html/core.html#aware-list】
前一个小节内容介绍了BeanPostProcessor后置处理器接口,其中提到了多个BeanPostProcessor接口的执行顺序问题,这一小节就来看看如何自定义执行顺序。
BeanPostProcessor官方教程文档:【
https://docs.spring.io/spring-framework/docs/6.0.0-M3/reference/html/core.html#
beans-factory-extension-bpp】
1.1、BeanPostProcessor执行顺序
Spring允许创建多个BeanPostProcessor后置处理器接口,多个BeanPostProcessor接口之前的调用顺序,是由注册到Spring容器中的先后顺序决定。
Spring允许开发人员自定义BeanPostProcessor接口之间的先后执行顺序,目前有三种方式定义执行顺序:
- 第一种:使用@Order注解定义,数值越小优先级越高。
- 第二种:实现Ordered接口,重写getOrder()方法,数值越小优先级越高。
- 第三种:在XML配置文件中,按照<bean>标签的先后定义顺序,先定义的优先级越高。
这一小节先介绍第二种和第三种方式,第一种方式后续学习注解开发的时候,再来回顾一下。
1.2、案例代码
下面就通过具体的代码,来看看多个BeanPostProcessor接口执行顺序到底是怎么样的,这里我也使用到了前几个小节学习的相关接口,目的是为了看下Aware相关接口和BeanPostProcessor后置处理器接口之间的先后执行顺序。
- 创建3个类,并且都要实现BeanPostProcessor接口,例如:MyCustomBeanPostProcessor类。
package com.spring.study;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @description 自定义Bean的后置处理器
*/
public class MyCustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用 MyCustomBeanPostProcessor 的 postProcessBeforeInitialization() 前置方法");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用 MyCustomBeanPostProcessor 的 postProcessAfterInitialization() 后置方法");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
- 在XML配置文件里面,注册BeanPostProcessor处理器。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
注册自定义的BeanPostProcessor后置处理器接口
-->
<bean class="com.spring.study.MyCustomBeanPostProcessor3"/>
<bean class="com.spring.study.MyCustomBeanPostProcessor"/>
<bean class="com.spring.study.MyCustomBeanPostProcessor2"/>
<!--
定义bean
-->
<bean id="aService" class="com.spring.study.AService" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="ADemo"/>
</bean>
</beans>
- 执行案例代码,结果如下。
上面这种方式是根据<bean>标签在XML配置文件中的定义顺序来决定BeanPostProcessor的执行顺序,当然我们也可以实现Ordered接口,自定义BeanPostProcessor执行顺序。案例代码如下所示:
package com.spring.study.ordered;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
/**
* @description 自定义Bean的后置处理器
*/
public class MyCustomBeanPostProcessor implements BeanPostProcessor, Ordered {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用 MyCustomBeanPostProcessor 的 postProcessBeforeInitialization() 前置方法");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用 MyCustomBeanPostProcessor 的 postProcessAfterInitialization() 后置方法");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
@Override
public int getOrder() {
// 指定执行顺序
return 3;
}
}
- 通过实现Ordered接口方式定义执行顺序的运行结果如下:
查看控制台输出日志,可以看见每一个方法的先后执行顺序,这也是Bean的生命周期中会涉及到的一些方法回调顺序,如下所示:
- 实例化。
- 属性赋值。
- 执行BeanNameAware接口。
- 执行BeanFactoryAware接口。
- 执行ApplicationConextAware接口。
- 按照优先级,依次执行BeanPostProcessor的postProcessBeforeInitialization()前置方法。
- 执行InitializingBean接口。
- 调用init-method初始化方法。
- 按照优先级,依次执行BeanPostProcessor的postProcessAfterInitialization()后置方法。
- 执行DisposableBean接口。
- 调用destroy-method销毁方法。
1.3、源代码获取
源代码地址:
https://gitcode.com/knowledge-base/spring-study/tree/spring6-chapter-18
到此,Spring生命周期中多个BeanPostProcessor接口的先后执行顺序就介绍完了。
今天就到这里,未完待续~~
- 上一篇: Java 集合框架全面解析:选对数据结构,提升开发效率
- 下一篇: Java集合类面试高频问题全解析
猜你喜欢
- 2025-04-26 图解 SQL 执行顺序,三连暴击
- 2025-04-26 十大排序算法时空复杂度
- 2025-04-26 java实现10种排序算法
- 2025-04-26 java实现冒泡排序
- 2025-04-26 10 个经典的 Java 集合面试题,看你能否答得上来?
- 2025-04-26 Java面试中常被问到的集合类深度解读
- 2025-04-26 Java ArrayList基本操作及高级用法
- 2025-04-26 使用组合、排列和产品进行彻底的 JUNIT5测试
- 2025-04-26 Redis 源码简洁剖析 - Sorted Set 有序集合
- 2025-04-26 常见的三种排序(冒泡排序、插入排序、选择排序)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)