SpringBoot 自定义starter @AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder 不生效问题
Posted catoop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 自定义starter @AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder 不生效问题相关的知识,希望对你有一定的参考价值。
如题,关于 @Configuration 三大件 @AutoConfigureBefore
、@AutoConfigureAfter
、@AutoConfigureOrder
的具体详解,本文不做赘述,请自行科普。
本文目的是为了陈述一个使用这三大件注解时非常容易触发的一个问题点 “如题,不生效” 的结论,直接说结论,就知道如何避免了。
本文发生的问题,主要是在你编写一个自己的 starter 包的时候容易出现。
本文所有代码的前提场景是自定义 starter 时候出现这样的问题,如果你不是自定义 starter 出现类似的问题,本文 “可能能帮助到你”,也可能解决不了你的问题,不过试试看吧,至少看完本文能给你带来新的知识点。
验证是否有问题的方法
1、编写以下代码
@AutoConfigureBefore(Test3Config.class)
@AutoConfigureAfter(Test1Config.class)
@Configuration(proxyBeanMethods = false)
public class Test2Config {
public Test2Config() {
System.out.println("配置类 Test2Config 构造方法被执行...");
}
}
@Configuration(proxyBeanMethods = false)
public class Test1Config {
public Test1Config () {
System.out.println("配置类 Test1Config 构造方法被执行...");
}
}
@Configuration(proxyBeanMethods = false)
public class Test3Config {
public Test3Config () {
System.out.println("配置类 Test3Config 构造方法被执行...");
}
}
@SpringBootApplication
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args).close();
}
}
2、spring.factories 里不要添加 Test1Config、Test2Config、Test3Config
3、运行程序,此时如果你能看到构造方法的输出(正常来说输出打印的内容也不会是 123 的顺序),能输出内容就是不应该的。因为在自定义 starter 的时候,我们的(Test1Config、Test2Config、Test3Config )肯定是要通过配置到 spring.factories 中来被加载的。而按照我们第2步的要求,我们并没有配置 spring.factories,然后执行程序后却被加载了,说明这3个类被其他地方配置的扫描包扫描到了(你需要找到这个扫描包的配置),这肯定是不应该的。
4、如果第3点没有任何输出,那么正常来说就不会出现本文标题所述的问题。
5、如果第3点的问题被实锤了,那么请解决掉被扫描到的问题,然后将 Test1Config、Test2Config、Test3Config 添加到 spring.factories 中。在保证配置类不在扫描包的范围内的情况下再重新运行程序你就能看到我们所期望的 123 顺序输出,如下:
配置类 Test1Config 构造方法被执行...
配置类 Test2Config 构造方法被执行...
配置类 Test3Config 构造方法被执行...
总结
1、自定义 starter 中配置到 spring.factories 中的配置类,应避免在自动扫描包的覆盖范围!
2、@ComponetScan 扫描到的配置类,会立即初始化,所以这3个控制配置类顺序的注解肯定无用了。
3、原则上需要被定义到 spring.factories 中的配置类是不需要写 @Configuration 注解的,如果要写 @Configuration 注解,也肯定是 @Configuration(proxyBeanMethods = false)
,如果这里你不清楚 proxyBeanMethods = false
的作用,可以移步查看文章《Srpign @Configuration proxyBeanMethods=false 》。
(END)
以上是关于SpringBoot 自定义starter @AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder 不生效问题的主要内容,如果未能解决你的问题,请参考以下文章
自定义SpringBoot Starter 实现请求日志打印
自定义SpringBoot Starter 通过注解启动装配