工程一配置如下:
@AutoConfigureOrder(1) @Configuration @ComponentScan(value = {"com.git.hui.boot.order.addition"}) public class AdditionOrderConf { public AdditionOrderConf() { System.out.println("additionOrderConf init!!!"); } }注意自动配置类如要被正确加载,需要在工程的 /META-INF/spring.factories文件中定义
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.git.hui.boot.order.addition.AdditionOrderConf工程二的配置如下:
@Configuration @AutoConfigureOrder(-1) @ComponentScan("com.git.hui.boot.order.addition2") public class AdditionOrderConf2 { public AdditionOrderConf2() { System.out.println("additionOrderConf2 init!!!"); } }然后我们在项目内部添加一个配置
@AutoConfigureOrder(10) @Configuration public class OrderConf { public OrderConf() { System.out.println("inner order conf init!!!"); } }因为注解适用于外部依赖包中的自动配置类的顺序,所以上面三个配置类中,正确的话 AdditionOrderConf2 在 AdditionOrderConf1 之前;而 OrderConf 并不会收到注解的影响,默认环境下,内部定义的配置类会优于外部依赖,从下面的输出也可以佐证我们说明(当然为了验证确实如次,还应该调整下两个外部工程配置类的顺序,并观察下加载顺序是否随之改变,我们这里省略掉了)
IV. 小结本篇主要介绍了网上对@Order和@AutoConfigureOrder常见的错误使用姿势,并给出了正确的使用 case。
下面用简单的几句话介绍一下正确的姿势
@Order注解不能指定 bean 的加载顺序,它适用于 AOP 的优先级,以及将多个 Bean 注入到集合时,这些 bean 在集合中的顺序
@AutoConfigureOrder指定外部依赖的 AutoConfig 的加载顺序(即定义在/META-INF/spring.factories文件中的配置 bean 优先级),在当前工程中使用这个注解并没有什么鸟用
同样的 @AutoConfigureBefore和 @AutoConfigureAfter这两个注解的适用范围和@AutoConfigureOrder一样
0. 项目工程:https://github.com/liuyueyi/spring-boot-demo
源码模块: -
1. 一灰灰 Blog尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
一灰灰 Blog 个人博客 https://blog.hhui.top
一灰灰 Blog-Spring 专题博客