Springboot项目中最核心也是入门级的注解就是@SpringBootApplication,这是由@EnableAutoConfiguration、@ComponentScan和@Configuration组成的一个组合注解。
接下来我们将分析其中的EnableAutoConfiguration注解的源码。
springboot的一大特性就是“约定大于配置”,EnableAutoConfiguration这个注解从字面上就可以理解是一个实现自动配置的注解,也是“约定”能够生效的一大保障。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
String[] excludeName() default {};
}
EnableAutoConfiguration有两大属性,exclude和excludeName都是用来指定不需要自动配置的配置类。
分析完EnableAutoConfiguration的属性,接下来和其它Enable类型的注解一下,我们进入@import注解指定的类,分析springboot是如何实现自动配置的。
AutoConfigurationImportSelector是一个ImportSelector类,selectImports的返回值就是其最后注入IOC容器的配置类。另外,AutoConfigurationImportSelector还用到了beanClassLoader、environment、resourceLoader,因此其还实现了BeanClassLoaderAware,EnviromentAware,ResourceLoaderAware接口。
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
try {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);
configurations = removeDuplicates(configurations);
configurations = sort(configurations, autoConfigurationMetadata);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAuto