@AutoConfigureBefore、@AutoConfigureAfter使用细节

背景

我们在定义spring-boot-starter时,有时会使用@AutoConfigureBefore、@AutoConfigureAfter来指定自动装配配置之间的加载顺序。

使用此注解要注意两点:

  • 被注解修饰的类要在spring.factories中的org.springframework.boot.autoconfigure.EnableAutoConfiguration指定,不能用@Configuration修饰,否则会立刻被spring扫描到,不能实现指定顺序,之前的文章介绍过
  • @AutoConfigureBefore、@AutoConfigureAfter的作用是指定配置类加载的顺序,而不是bean的加载顺序,这点要注意,很多人也是疏忽了这点,本文重点分析的就是此部分

案例

spring.factories

复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  test.TestConfig2,\
  test.TestConfig

TestConfig

java 复制代码
public class TestConfig {
    
    public TestConfig(){
        System.out.println("====TestConfig====");
    }
    
    @Bean
    public Base base(){
        System.out.println("====base1====");
        return new Base(1);
    }
}

TestConfig2

java 复制代码
@AutoConfigureBefore(TestConfig.class)
public class TestConfig2 {
    
    public TestConfig2(){
        System.out.println("====TestConfig2====");
    }
    
    @Bean
    public Base base(){
        System.out.println("====base2====");
        return new Base(2);
    }
    
    @Bean
    public Test test(Base base){
        return new Test(base);
    }
}

Test

java 复制代码
public class Test {
    private Base base;
    
    public Test(Base base){
        this.base = base;
    }

    @PostConstruct
    public void init(){
        System.out.println("====" + base.i + "====");
    }
}
  • TestConfig和TestConfig2使用自动装配配置
  • TestConfig和TestConfig2都生成了类型Base,名字base的bean对象
  • TestConfig2使用@AutoConfigureBefore指定在TestConfig之前进行加载
  • TestConfig2生成了类型Test,名字test的bean对象并注入了类型Bean的bean对象

结果

复制代码
====TestConfig2====
====TestConfig====
====base1====
====1====

结论

  • @AutoConfigureBefore可以指定TestConfig2在TestConfig之前进行生成加载
  • 但不能指定@Bean生成对象的顺序,这里看到注入的Base类型对象是TestConfig生成的

那么要指定bean的加载顺序怎么做?

可以用@ConditionalOnMissingBean注解

案例中只修改TestConfig,其余不变

TestConfig

java 复制代码
public class TestConfig {
    
    public TestConfig(){
        System.out.println("====TestConfig====");
    }
    
    @Bean
    @ConditionalOnMissingBean
    public Base base(){
        System.out.println("====base1====");
        return new Base(1);
    }
}

结果

复制代码
====TestConfig2====
====base2====
====2====
====TestConfig====

可以看到可以通过@ConditionalOnMissingBean来控制bean对象的加载顺序

相关推荐
苏三说技术2 小时前
聊聊Redisson最常见的8个坑
后端
学长毕设5 小时前
基于SpringBoot的野生动物公益保护平台设计与实现-附源码
java·spring boot·后端
梦里寻码5 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
鶴哥只手遮天5 小时前
《Redis 8.10.3 深度剖析》系列 ·第 10 章 Hash 一:`listpack`、`hashtable` 与 `LISTPACK_EX`
redis·后端·开源
johnjincaaaa5 小时前
WebAssembly 逆向实战:从 0 搞懂猿人学第 15 题
后端
Gopher_HBo5 小时前
Go CPU 剖析:四角色白话机制 + 实测实验
后端
猿人谷5 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
the局外人6 小时前
LangChain ToolRuntime 入门:context、state 与 store 的实际用法
后端·langchain·agent
回家路上绕了弯6 小时前
当 AI 越来越能干,我们如何理解自己的价值?
后端
陈随易6 小时前
Node.js 2026上半年都有哪些性能提升?
前端·后端·程序员