@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 曾经被初始化!