@AutoConfigureAfter和@AutoConfigureBefore排序生效了?

注释

聊聊SpringBoot Bean加载和 主动配置的程序问题。

理论误区

来看看理论开发中存在的问题。咱们想要的后果A-->B-->C,上面写法是最常见的谬误。

@Configurationpublic class ConfigurationA {    ConfigurationA(){        System.out.println("CofigurationA  曾经被初始化!");    }}@Configuration@AutoConfigureAfter(ConfigurationA.class)public class ConfigurationB {    ConfigurationB(){        System.out.println("ConfigurationB  曾经被初始化!");    }}@Configuration@AutoConfigureAfter(ConfigurationB.class)public class ConfigurationC {    ConfigurationC(){        System.out.println("CofigurationC  曾经被初始化!");    }}

来来来执行一把。。。。

执行后果:CofigurationA   曾经被初始化!ConfigurationB  曾经被初始化!CofigurationC   曾经被初始化!

WTF!!!!!!!!不是说有问题吗?

别急!!调整下代码,想要的后果是C-->B-->A,来将代码调整下:

@Configuration@AutoConfigureAfter(ConfigurationB.class)public class ConfigurationA {    ConfigurationA(){        System.out.println("CofigurationA  曾经被初始化!");    }}@Configuration@AutoConfigureAfter(ConfigurationC.class)public class ConfigurationB {    ConfigurationB(){        System.out.println("ConfigurationB  曾经被初始化!");    }}@Configurationpublic class ConfigurationC {        ConfigurationC(){        System.out.println("CofigurationC  曾经被初始化!");    }}

来来开席开席!!!!

执行后果:CofigurationA   曾经被初始化!ConfigurationB  曾经被初始化!CofigurationC   曾经被初始化!

从下面的后果是能够看出@AutoConfigureAfter并没有什么卵用。第一次可能失去正确后果是老天保佑。。。。。


所以来看看源码:@AutoConfigureAfter归纳来说得益于SpringBoot主动配置(@EnableAutoConfiguration);@EnableAutoConfiguration通过@Import将EnableAutoConfigurationImportSelector引入
这边次要看下EnableAutoConfigurationImportSelector-->selectImports()办法

    public String[] selectImports(AnnotationMetadata metadata) {        if (!isEnabled(metadata)) {            return NO_IMPORTS;        }        try {            AnnotationAttributes attributes = getAttributes(metadata);            //加载META-INF下spring.factories配置类            List<String> configurations = getCandidateConfigurations(metadata,                    attributes);            configurations = removeDuplicates(configurations);            Set<String> exclusions = getExclusions(metadata, attributes);            configurations.removeAll(exclusions);            //将配置类进行排序            configurations = sort(configurations);            recordWithConditionEvaluationReport(configurations, exclusions);            return configurations.toArray(new String[configurations.size()]);        }        catch (IOException ex) {            throw new IllegalStateException(ex);        }    }            protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,                AnnotationAttributes attributes) {            List<String> configurations = SpringFactoriesLoader.loadFactoryNames(                    getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());            Assert.notEmpty(configurations,                    "No auto configuration classes found in META-INF/spring.factories. If you "                            + "are using a custom packaging, make sure that file is correct.");            return configurations;        }

看到这里法外狂徒 "张三"默默的在META-INF下spring.factories加上了.......

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.*******.Demo.ConfigurationA,\com.*******.Demo.ConfigurationB,\com.*******.Demo.ConfigurationC

张三:就这,就这......?张三启动了核按钮:

执行后果:CofigurationA   曾经被初始化!ConfigurationB  曾经被初始化!CofigurationC   曾经被初始化!