首页 > 其他分享 >SpringBoot项目中对定义的多个BeanPostProcessor排序

SpringBoot项目中对定义的多个BeanPostProcessor排序

时间:2024-04-14 13:22:51浏览次数:24  
标签:BeanPostProcessor SpringBoot class public bean UserService 排序 Order

前言

BeanPostProcessor 是 Spring 提供的一种扩展机制,可以让我们在 bean 初始化前后做一些额外的操作,Spring 中的 @Async,@Scheduled,@RabbitHandler 等注解的底层实现都是 BeanPostProcessor 在起作用,如 RabbitListenerAnnotationBeanPostProcessor。

代码示例

@Configuration
public class BeanPostProcessorConfig2 {

    @Component
    @Order(Ordered.LOWEST_PRECEDENCE)
    public static class UserServiceBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof UserService) {
                System.out.println("UserService");
            }
            return bean;
        }
    }

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public static class UserServiceBeanPostProcessor2 implements BeanPostProcessor {
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof UserService) {
                System.out.println("UserService2");
            }
            return bean;
        }
    }

    @Component
    public static class UserService {

    }

    @Component
    public static class OrderService {

    }
}

这里我们定义了两个 BeanPostProcessor,第二个优先级更高,但优先级设置没生效,还是先打印了 UserService

原因分析

  1. AbstractApplicationContext 在 refresh() 方法内会处理 BeanPostProcessor,具体方法为 registerBeanPostProcessors()。
  2. 进入 registerBeanPostProcessors() 方法
  3. 再进入 PostProcessorRegistrationDelegate 的 registerBeanPostProcessors() 方法
  4. 可以看到,Spring 只会处理 实现 Ordered 接口或 PriorityOrdered 接口的 BeanPostProcessor(不支持 @Order 注解)。
  5. 最终使用的比较器为 AnnotationAwareOrderComparator(它是支持 @Order 注解的),但因为上一步已经将 @Order 注解的排除掉了,所以也不会生效。

解决方法

不使用 @Order 注解来设置优先级,使用 Ordered 接口或 PriorityOrdered 接口。

扩展

BeanFactoryPostProcessor 也是和 BeanPostProcessor 同样的逻辑,但 BeanDefinitionRegistryPostProcessor 不一样,@Order 注解, Ordered 接口和 PriorityOrdered 接口都支持。

标签:BeanPostProcessor,SpringBoot,class,public,bean,UserService,排序,Order
From: https://www.cnblogs.com/strongmore/p/18049572

相关文章

  • 快速排序
    手写快速排序:packagecom.atguigu.react2024;importjava.util.Arrays;publicclassQuicklySort{publicstaticvoidmain(String[]args){int[]arr={9,5,8,7,2,3,6,3,4,1,10};quickSort(arr,0,arr.length-1);//Array......
  • hive窗口分析函数使用详解系列二之分组排序窗口函数
    1.综述我们讨论面试中各大厂的SQL算法面试题,往往核心考点就在于窗口函数,所以掌握好了窗口函数,面对SQL算法面试往往事半功倍。已更新第一类聚合函数类,点击这里阅读hive窗口函数聚合函数类本节介绍Hive聚合函数中的第二类聚合函数:分组排序窗口函数。这些函数的用法不仅仅适用于......
  • Springboot集成WebSocket实现智能聊天【Demo】
    背景openai目前越来越流行,其他ai产业也随之而来,偶然翻到openai接口文档,就想着可以调用接口实现智能聊天,接下来就写写我怎么接入websocket的过程,文笔不佳,谅解。接入WebSocket1.webSocket依赖<dependency><groupId>org.springframework.boot</groupId><artifactId......
  • SpringBoot项目中对定义的多个Aspect类排序
    代码示例@ConfigurationpublicclassAspectConfig{@Aspect@Component@Order(Ordered.HIGHEST_PRECEDENCE)publicstaticclassLogAspect{@Pointcut("execution(public*com.imooc.spring.web..*.*(..))")publicvoidwe......
  • 排序算法-快速排序
    排序算法-快速排序一、快速排序介绍1.1原理介绍快速排序(QuickSort)是一种常用的排序算法,也是一种基于分治思想的排序算法。快速排序的基本思想是选取一个基准元素,将数组分成两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素,然后对左右两部分分别......
  • 排序算法
    排序算法1.排序算法定义:排序算法是一种将数据元素按特定顺序(通常是升序或降序)排列的算法。排序是计算机科学中最基本的操作之一,用于数据组织和优化搜索算法等。2、排序算法分类快速排序归并排序堆排序冒泡排序快速排序:快速排序是一种高效的分治排序算法,通过选定一个'......
  • P1155 [NOIP2008 提高组] 双栈排序
    P1155[NOIP2008提高组]双栈排序有思维的二分图染色题。对于“双”类的题目,我们通常分开考虑单个时的性质。对于一个栈,有一个基本的定理:若出现\(i<j<k\),有\(a_k<a_i<a_j\),那么一定不合法,即没有合法的出栈顺序使之有序。对于两个栈,我们相当于把序列分成两部分,使每部分之间......
  • SpringBoot中的Jetty使用及分析
    前言和Tomcat类似,Jetty也是一个Web应用服务器,相对于Tomcat,Jetty更加轻量、更加简易、更加灵活。今天通过代码来简单分析下SpringBoot中是如何启动Jetty的。Jetty简介使用importjava.io.File;importjava.io.IOException;importjava.net.InetAddress;import......
  • SpringBoot使用 nacos 会默认加载项目名配置文件
    问题描述boostrap.yml配置如下spring:application:name:cnblogscloud:nacos:config:server-addr:http://ip:8848namespace:d8b0df04-aa58-4a5b-b582-7d133b9e8b2c#命名空间IDfile-extension:yamlusern......
  • bufDataSet排序
    https://wiki.lazarus.freepascal.org/How_to_write_in-memory_database_applications_in_Lazarus/FPC SortingDBGridonTitleClickeventforTBufDataSetIfyouwishtoenableconsecutiveascendinganddescendingsortingofaDBGridshowingsomedatafromTBufD......