标签:排序 spring 配置 springframework factories org orderedClassNames Configuration
SpringBoot 会对 spring.factories 中的 @Configuration 类进行排序。
注意:只是对所有 spring.factories 中的 @Configuratin 类排序(也就是通常使用的 starter 里面的配置)
排序使用的注解有:@AutoConfigureOrder、@AutoConfigureBefore、@AutoConfigureAfter
也就是说,@AutoConfigureOrder、@AutoConfigureBefore、@AutoConfigureAfter 这三个注解只对 spring.factories 中的 @Configuration 类生效
org.springframework.context.annotation.ConfigurationClassParser.DeferredImportSelectorGrouping#getImports()
1 public Iterable<Group.Entry> getImports() { 2 for (DeferredImportSelectorHolder deferredImport : this.deferredImports) { 3 // 1. 通过 ImportSelector 加载所有待解析的 @Configuration 类 4 this.group.process(deferredImport.getConfigurationClass().getMetadata(),deferredImport.getImportSelector()); 5 } 6 // 2. 获取排序过的 @Configuration 类 7 return this.group.selectImports(); 8 }
1. org.springframework.context.annotation.DeferredImportSelector.Group.Group#process() 1.1 org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry() 1.1.1 org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames() // 加载所有 spring.factories 中的类 2. org.springframework.context.annotation.DeferredImportSelector.Group#selectImports() 2.1 org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.AutoConfigurationGroup#sortAutoConfigurations() // 对 spring.factories 中的 @Configuration 类进行排序 2.1.1 org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames // 加载 spring.factories 文件
org.springframework.boot.autoconfigure.AutoConfigurationSorter#getInPriorityOrder()
1 List<String> getInPriorityOrder(Collection<String> classNames) { 2 AutoConfigurationClasses classes = new AutoConfigurationClasses(this.metadataReaderFactory, 3 this.autoConfigurationMetadata, classNames); 4 List<String> orderedClassNames = new ArrayList<>(classNames); 5 // Initially sort alphabetically 6 // 1. 按字母顺序排 7 Collections.sort(orderedClassNames); 8 // Then sort by order 9 // 2. 按 @AutoConfigureOrder 排 10 orderedClassNames.sort((o1, o2) -> { 11 int i1 = classes.get(o1).getOrder(); 12 int i2 = classes.get(o2).getOrder(); 13 return Integer.compare(i1, i2); 14 }); 15 // Then respect @AutoConfigureBefore @AutoConfigureAfter 16 // 3. 按 @AutoConfigureBefore @AutoConfigureAfter 排 17 orderedClassNames = sortByAnnotation(classes, orderedClassNames); 18 return orderedClassNames; 19 }
标签:排序,spring,配置,springframework,factories,org,orderedClassNames,Configuration 来源: https://www.cnblogs.com/kevin-yuan/p/12431791.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。