美文网首页Spring Boot
@EnableAutoConfiguration源码解析

@EnableAutoConfiguration源码解析

作者: Shine_Chan | 来源:发表于2018-07-27 15:37 被阅读33次

    本文基于spring-boot:1.5.14.RELEASE
    本人能力有限,很多地方可能说的不够详尽,不到之处还请斧正。写本文的目的主要是巩固自己的学习,也给spring boot初学者一些帮助。

    @EnableAutoConfiguration中通过@Import引入EnableAutoConfigurationImportSelector,继承AutoConfigurationImportSelector。使用ImportSelector可以在Annotation上添加一些属性,然后根据属性的不同加载不同的bean。
    下面是AutoConfigurationImportSelector的selectImports方法代码:

    
    @Override
    
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
    
      if (!isEnabled(annotationMetadata)) {
    
          return NO_IMPORTS;
    
      }
    
      try {
          AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
          
          AnnotationAttributes attributes = getAttributes(annotationMetadata);
    
          List configurations = getCandidateConfigurations(annotationMetadata,attributes);
    
          configurations = removeDuplicates(configurations); // 利用LinkedHashSet去除重复配置
    
          configurations = sort(configurations, autoConfigurationMetadata);
    
          Set exclusions = getExclusions(annotationMetadata, attributes);
    
          checkExcludedClasses(configurations, exclusions);
    
          configurations.removeAll(exclusions);  // 去除所有exclude的配置
      
          configurations = filter(configurations, autoConfigurationMetadata); 
    
          fireAutoConfigurationImportEvents(configurations, exclusions);
    
          return configurations.toArray(new String[configurations.size()]);
    
      }
    
      catch (IOException ex) {
    
          throw new IllegalStateException(ex);
    
      }
    
    }
    
    
    1. isEnabled方法通过spring.boot.enableautoconfiguration的值确定是否开启,默认开启。
    2. AutoConfigurationMetadataLoader.loadMetadata
      加载spring-boot-autoconfig包下的spring-autoconfigure-metadata.properties配置文件,获取所有支持自动配置的信息-> Properties -> AutoConfigurationMetadata
    3. getAttributes
      获取EnableAutoConfiguration的属性,也就是exclue和excludeName的内容
    4. getCandidateConfigurations
      SpringFactoriesLoader.loadFactoryNames,根据META-INF/spring.factories从jar包中获取所有支持EnableAutoConfiguration的组件信息
    • ...简单的方法见代码后面注释
    1. filter
      这里filter方法中,AutoConfigurationImportFilter的match()方法,由OnClassCondition实现,即通过查找有没有导入某些jar包,通过新建一个布尔类型数组,来标记没有导入jar的AutoConfiguration,然后skip掉。

    参考: http://fangjian0423.github.io/2016/11/13/springboot-enable-annotation/

    相关文章

      网友评论

        本文标题:@EnableAutoConfiguration源码解析

        本文链接:https://www.haomeiwen.com/subject/pnowmftx.html