@SpringBootApplication
首先在springboot的启动类上有这么一个注解,我们点进去可以看到以下三个核心注解
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
1、@SpringBootConfiguration
这个注解点进去我们可以看到@Configuration,表名当前类是一个配置类
2、@ComponentScan
指定扫描哪些,是spring的一个注解
3、@EnableAutoConfiguration(重要)
我们点进来这个注解可以看到有以下注解,我们进行一一探究
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class)// 给容器导入一个组件 public @interface EnableAutoConfiguration {}
3.1、@AutoConfigurationPackage
我们点开这个注解可以看到如下注解,
@Import(AutoConfigurationPackages.Registrar.class)// 给容器导入组件 public @interface AutoConfigurationPackage {}
点开Registrar,如图
我们可以看到有这么一个方法,该方法表示把指定包下的所有组件都导入进来,这个包就是我们启动类所在的包名,我们可以debug一下,如图
这也就解释了一个事情,组件如果不在一个包下,无法扫描到的问题
所以该注解就是自动配置包,指定了包的默认规则
3.2、@Import(AutoConfigurationImportSelector.class)
继续点进去,我们可以看到这么一个方法selectImports
(给容器批量导入一些组件)
调用了getAutoConfigurationEntry
方法,我们来研究一下这个方法
我们可以看到里面有一个配置的集合,我们打一个断点看看集合里面都是什么配置,debug一下
可以看到,List集合里面都是一些需要导入到组件中的配置类,那么问题来了,这些配置类时如何获取的呢,我们观察这个图中的这行代码:
打开getCandidateConfiguration方法,
该方法调用了一个工厂加载器,点开loadFactoryNames方法:
进入loadSpringFactories方法:
可以看到这个方法会扫描META-INF/spring.factories
位置下的所有文件
这个文件我们可以在spring-boot-autoconfigure-2.5.4.jar里面找到
所有的自动配置类都在里面,最终会根据条件配置规则,按需配置。