Spring Boot 自动配置原理详解
Posted ssen001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 自动配置原理详解相关的知识,希望对你有一定的参考价值。
最近在学习Spring Boot,感觉 Spring 自动配置很神奇,所以着手写下这篇文章,本文基于Spring Boot 2.0.1 源码分析自动配置原理,如有错误,望批评指出。
1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Inherited 5 @SpringBootConfiguration // 1 6 @EnableAutoConfiguration // 2 7 @ComponentScan(excludeFilters = { 8 @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), 9 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) 10 public @interface SpringBootApplication {}
1、@SpringBootConfiguration 配置类注解
声明该类是SpringBoot一个配置类,能够使用Spring标准注解 @Configuration 代替。
2、@EnableAutoConfiguration 自动配置类注解
启用Spring应用程序上下文的自动配置。通过导入AutoConfigurationImportSelector.class,将类路径下 META-INF/spring.factories 里面配置的所有 EnableAutoConfiguration 的值加入到了容器中。
1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Inherited 5 @AutoConfigurationPackage // 1 6 @Import(AutoConfigurationImportSelector.class) // 2 7 public @interface EnableAutoConfiguration {}
-
-
1、@AutoConfigurationPackage 自动配置包
通过导入AutoConfigurationPackages.Registrar.class 类,将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器
-
2、AutoConfigurationImportSelector 自动配置导入选择器类,关键方法 selectImports
将所有需要导入的组件以全类名的方式返回;返回组件类就会被添加到容器中;
1 @Override 2 public String[] selectImports(AnnotationMetadata annotationMetadata) { 3 if (!isEnabled(annotationMetadata)) { // 1 4 return NO_IMPORTS; 5 } 6 AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader 7 .loadMetadata(this.beanClassLoader); // 2 8 AnnotationAttributes attributes = getAttributes(annotationMetadata); 9 List<String> configurations = getCandidateConfigurations(annotationMetadata, 10 attributes);// 3 11 configurations = removeDuplicates(configurations); 12 Set<String> exclusions = getExclusions(annotationMetadata, attributes); 13 checkExcludedClasses(configurations, exclusions); 14 configurations.removeAll(exclusions); 15 configurations = filter(configurations, autoConfigurationMetadata); 16 fireAutoConfigurationImportEvents(configurations, exclusions); 17 return StringUtils.toStringArray(configurations); 18 }
-
-
-
-
1、判断是否开启自动配置,若没有开启配置,返回空数组
-
2、加载 META-INF/spring-autoconfigure-metadata.properties 中自动配置元数据
-
3、获取候选的配置
-
-
-
-
-
SpringFactoriesLoader.loadFactoryNames()
-
扫描所有jar包类路径下 META-INF/spring.factories
-
把扫描到的这些文件的内容包装成properties对象
-
从properties中获取到 EnableAutoConfiguration.class 类(类名)对应的值,然后把他们添加在容器中
-
-
-
以上是关于Spring Boot 自动配置原理详解的主要内容,如果未能解决你的问题,请参考以下文章
资源|详解Spring Boot编程思想-从技术到规范,从原理到源码-百度网盘免费资源分享