该注解作用在MainApplication里面,会将该类所在的包内所有组件全部装配
里面的主要注解是
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
下面我们来逐个详解
1.首先看@SpringBootConfiguration
我们点入,发现这就是个简单的Configuration
2.接下来看@ComponentScan
这个就是简单的指明扫描的包,也不是太重要
3.最后看@EnableAutoConfiguration
这个就是比较复杂
其中主要是
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class})
3.1 我们先来看第一个@AutoConfigurationPackage
意思是自动配置包,点开看源码
发现这是一个import导包,并不复杂,那么核心必然存在于所导入的内容上,也就是
Registrar.class,我们点开
这里面是一个静态内部类,包含两个方法
我们打上断点,进行检查
可以看到几个有趣的信息,比如source就是MainApplication
接下来计算一下
(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames()
可以看到,这正是我们的MainApplication所在的包,也就是装配调用的包
3.2接下来我们该看
@Import({AutoConfigurationImportSelector.class})
这只是一个简单的导入,那么真正核心的部分必然是导入的class,我们点开进去
我们还是打上断点
这里是不是有个东西很熟悉annotationMetadata,这个东西之前我们见过,就是所有组件
然后我们看看他进行了什么操作
AnnotationAttributes attributes = this.getAttributes(annotationMetadata); 将annotationMetadata的内容转化为AnnotationAttributes 类型 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); 再把annotationMetadata内容转化为list列表 configurations = this.removeDuplicates(configurations); 去除配置configurations Set<String> exclusions = this.getExclusions(annotationMetadata, attributes); 获取exclusions this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); 移除exclusions configurations = this.getConfigurationClassFilter().filter(configurations); this.fireAutoConfigurationImportEvents(configurations, exclusions);
经过这一系列操作,我们成功去除了多余的组件
也就是实现了自动装配