Spring Boot 自动配置原理详解


最近在学习Spring Boot,感觉 Spring 自动配置很神奇,所以着手写下这篇文章,本文基于Spring Boot 2.0.1 源码分析自动配置原理。

一、@SpringBootApplication  主程序入口类注解

 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 类(类名)对应的值,然后把他们添加在容器中


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM