会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 。

文章插图
有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作 。那是如何获取到这些配置类的呢 , 看看下面这个方法:
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;} else {AnnotationAttributes attributes = this.getAttributes(annotationMetadata);List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);configurations = this.removeDuplicates(configurations);Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);this.checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = this.filter(configurations, autoConfigurationMetadata);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);}}我们可以看到getCandidateConfigurations这个方法 , 他的作用就是引入系统已经加载好的一些类 , 到底是那些类呢:
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass, this.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;}public static List<String> loadFactoryNames(Class<?> factoryClass, @able ClassLoader classLoader) {String factoryClassName = factoryClass.getName;return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList);}会从 META-INF/spring.factories 中获取资源 , 然后通过 Properties 加载资源:private static Map<String, List<String>> loadSpringFactories(@able ClassLoader classLoader) {MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);if (result != ) {return result;} else {try {Enumeration<URL> urls = classLoader !=? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");LinkedMultiValueMap result = new LinkedMultiValueMap;while(urls.hasMoreElements) {URL url = (URL)urls.nextElement;UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);Iterator var6 = properties.entrySet.iterator;while(var6.hasNext) {Map.Entry<?, ?> entry = (Map.Entry)var6.next;String factoryClassName = ((String)entry.getKey).trim;String var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue);int var10 = var9.length;for(int var11 = 0; var11 < var10; ++var11) {String factoryName = var9[var11];result.add(factoryClassName, factoryName.trim);}}}cache.put(classLoader, result);return result;} catch (IOException var13) {throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);}}}可以知道SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值 , 将这些值作为自动配置类导入到容器中 , 自动配置类就生效 , 帮我们进行自动配置工作 。以前我们需要自己配置的东西 , 自动配置类都帮我们完成了 。如下图可以发现Spring常见的一些类已经自动导入 。
文章插图
接下来看@ComponentScan注解 , @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes =
AutoConfigurationExcludeFilter.class) }) , 这个注解就是扫描包 , 然后放入spring容器 。
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}),@Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})})public @interface SpringBootApplication {}总结下 @SpringbootApplication:就是说 , 他已经把很多东西准备好 , 具体是否使用取决于我们的程序或者说配置 。接下来继续看run方法:
publicstaticvoidmain(String[] args) {SpringApplication.run(Application.class, args);}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Spring IOC容器对Bean实例化的过程详解源码分析
- Attention 详解深度学习中的注意力机制
- 雪莲花的做法大全家常,简单易学槐花的四种家常做法详解
- 朱元璋:我能活多久,朱元璋八字分析
- 战国时期两个字的名人,战国时期两个水利工程
- 副清风散,详解鸡冠花的药用功效与作用
- 杭白菊老字号品牌,杭白菊的生长习性
- 适合水果商标名字,0万买回商标
- 亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字
- Spring MVC 框架搭建配置方法及详解
