Spring自动配置类顺序控制问题

日常开发场景,需要对几个@Configuration标注的配置类控制下加载顺序,理所当然的用到了@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder三个控制注解,但是多次尝试均无效果,不管怎么调整依赖关系和order顺序,自动处理的顺序都是按照className的a-z顺序处理.
配置类示意如下:


@Configuration
public class TestConfigurations {
    @Configuration
    public static class ConfigA {

        @Bean
        public Object a() {
            System.out.println("a");
            return new Object();
        }
    }

    @Configuration
    public static class ConfigC {

        @Bean
        public Object c() {
            System.out.println("c");
            return new Object();
        }
    }

    @Configuration
    public static class ConfigB {

        @Bean
        public Object b() {
            System.out.println("b");
            return new Object();
        }
    }
}
//打印结果 a 、 b、c

在上端代码里面,如果尝试使用@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder调整配置顺序,是不会生效的,最终的结果打印顺序依然会是a、b、c

查看@AutoConfigureOrder注解的注释说明:

Auto-configuration specific variant of Spring Framework's @Order annotation. Allows auto-configuration classes to be ordered among themselves without affecting the order of configuration classes passed to AnnotationConfigApplicationContext.register(Class...).
As with standard @Configuration classes, the order in which auto-configuration classes are applied only affects the order in which their beans are defined. The order in which those beans are subsequently created is unaffected and is determined by each bean's dependencies and any @DependsOn relationships.

可以看到里面提到的自动配置类,和使用@Configuration修饰的标准配置类的处理是不同的,@AutoConfigureOrder等这几个配置注解只作用于自动配置类,而标准配置类只会受到@DependsOn和它们自身定义的依赖关系的影响。

那怎么把这几个类声明为自动配置类呢?
要做的事情只有两步:

  1. 将它们脱离出@ComponentScan的扫描
@ComponentScan(        excludeFilters =                @ComponentScan.Filter(                        type = REGEX,                        pattern = "net.xxx.abc.autoconfig.*"))

  1. 在META-INF/spring.factories中将这几个类加入到org.springframework.boot.autoconfigure.EnableAutoConfiguration声明下
# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\net.xxx.abc.autoconfig.TestConfigurations.ConfigA,\ net.xxx.abc.autoconfig.TestConfigurations.ConfigB,\ net.xxx.abc.autoconfig.TestConfigurations.ConfigC

这时再使用@AutoConfigureOrder调整顺序便会生效了:

@Configuration
public class TestConfigurations {
    @Configuration
    public static class ConfigA {

        @Bean
        @AutoConfigureOrder(1)
        public Object a() {
            System.out.println("a");
            return new Object();
        }
    }

    @Configuration
    @AutoConfigureOrder(2)
    public static class ConfigC {

        @Bean
        public Object c() {
            System.out.println("c");
            return new Object();
        }
    }

    @Configuration
    @AutoConfigureOrder(3)
    public static class ConfigB {

        @Bean
        public Object b() {
            System.out.println("b");
            return new Object();
        }
    }
}
//打印结果 a 、 c、b

你可能感兴趣的:(Spring自动配置类顺序控制问题)