《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配置文件中,按照
标签的先后定义顺序,先定义的优先级越高。
这一小节先介绍第二种和第三种方式,第一种方式后续学习注解开发的时候,再来回顾一下。
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处理器。
- 执行案例代码,结果如下。
上面这种方式是根据
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接口的先后执行顺序就介绍完了。
今天就到这里,未完待续~~
本文暂时没有评论,来添加一个吧(●'◡'●)