从springboot的启动动态加载中发现使用LinkedHashSet给ArrayList去重并保持顺序
今天跟随了汪云飞老师写的 Spring Boot实战 看了下springboot的启动动态加载。
一部分根据默认配置找jar包的原理:
@SpringBootApplication这个组合注解中的@EnableAutoConfiguration注解的@Import(AutoConfigurationImportSelector.class)将AutoConfigurationImportSelector.class导入。
selectImports方法中的getCandidateConfigurations方法--》
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());--》
现在来看loadFactoryNames方法:
先得到springboot
不得不说源码格式好。。给读者的观赏都是上下文紧密衔接的
找到key值为org.springframework.boot.autoconfigure.EnableAutoConfiguration 的property的list
得到了需要配置的jar包list后。有个去重方法,这是本次发现的重点!
去重方法实现如下:
linkedHashSet(Collection)其结果是构造与指定集合相同的元素的新的链接散列集
ArrayList可以通过集合泛型构造,方法是通过转为Object[]数组,再拷贝。
ok,是不是感觉使用LinkedHashSet给ArrayList去重并保持顺序非常好,毕竟是Spring的底层所使用,经得起推敲考研的。
这里找到一个对Spring EnableAutoConfigurationImportSelector 是如何工作的 注释比较全的博客:
https://blog.****.net/andy_zhang2007/article/details/78580980