
说到自动装配就要从@SpringBootApplication注解开始,先看看这个复合注解里面包含了什么。

@EnableAutoConfiguration是和我们的自动装配直接有关的注解,再来看看它里面包含了什么东西。

@SpringBootApplication下的@EnableAutoConfiguration注解包含了@AutoConfigurationPackage 和@Import .
@AutoConfigurationPackage 里面也是一个@Import注解,用来导入Register这个类。
添加该注解的类所在的包作为 自动配置包 进行管理,扫描springboot所在包 将其配置类交给IOC容器管理。

而@EnableAutoConfiguration的@Import导入的是AutoConfigurationImportSelector这个类。
AutoConfigurationImportSelector这个导入类的作用可以帮助将所有符合条件的@Configuration配置类交给IOC容器进行注入。
AutoConfigurationImportSelector下部分方法
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
//获取META-INF/spring.factories中配置文件中的需要自动装配的类名
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
利用EnableAutoConfigurationImportSelector给容器中导入一些组件
selectImport方法会返回候选的配置-getCandidateConfigurations
springFactoriesLoader.loaderFactoryNames会扫描Jar包路径下的META-INF/spring.factories,把扫描到的内容包装成properties对象
从properties对象中获取到有EnableAutoConfiguration.class对应的值,添加进容器

首先看下目录结构。
在此文件里配置好我们的XXXAutoConfiguration类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hodor.limiter.limiterspringbootstarter.HodorLimiterAutoConfiguration
@Configuration
@ComponentScan
public class HodorLimiterAutoConfiguration {
@Bean
public RateLimiterAspect rateLimiterAspect() {
return new RateLimiterAspect();
}
}
XXXAutoConfiguration就是一个简单的配置类,被@Bean注解的方法的返回值就可以注册进我们的IOC容器了。