Spring Boot

@EnableAutoConfiguration源码解析

2018-07-27  本文已影响33人  Shine_Chan

本文基于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/

上一篇下一篇

猜你喜欢

热点阅读