Spring Boot 自动配置原理详解

Posted ssen001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 类(类名)对应的值,然后把他们添加在容器中






以上是关于Spring Boot 自动配置原理详解的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 自动配置原理

Spring Boot自动配置原理(转)

资源|详解Spring Boot编程思想-从技术到规范,从原理到源码-百度网盘免费资源分享

4Spring Boot 自动配置原理

[Spring Boot] 4. Spring Boot实现自动配置的原理

[Spring Boot] 4. Spring Boot实现自动配置的原理