先给出我们今天的主角:
接下去分为三个部分,我一一来分析:
1.@SpringBootConfiguration springboot的配置注解
2.@EnableAutoConfiguration 自动配置注解
3.@ComponentScan 扫描包注解
1.1@SpringBootConfiguration springboot的配置注解
点开后发现就是个配置类:
2.@EnableAutoConfiguration 自动配置注解
打开后发现里面有两个注解:
1.自动导入包:@AutoConfigurationPackage
2.导入了一个自动导入选择器类:@Import(AutoConfigurationImportSelector.class)
2.1自动导入包进入后发现
就是一个自动注册类:所以到这我们就探究完成了
2.2我们进入自动导入选择器类里面(这是核心)
里面定义了各种环境变量,类加载器,资源加载器:
重点看这个方法getAutoConfigurationEntry:自动加载配置器实体,
然后这里使用了方法 getCandidateConfigurations获取候选的配置:
2.2.1我们这里再进入这个getCandidateConfigurations获取候选的配置的方法
这里获取了spring工厂的加载,加载工厂类:再点进去他加载的工厂类方法,这里我们分析两个地方:
1.getSpringFactoriesLoaderFactoryClass() 获取了加载类
2.SpringFactoriesLoader.loadFactoryNames 获取所有加载的配置方法
2.2.1.1 发现了神奇的事情,它获取了自动配置注解底下的类
也就是我们的主启动类:
主启动类:
2.2.1.2
获取所有的加载配置底下还有给返回所有的sring加载配置标注的是list,我们跟进看看
2.2.1.2.1 然后这个方法就是从配置文件或者从系统文件中获取,
然后循环获取所有的配置所有的配置,然后遍历出封装成properties供我们使用
这里代码太长了,我把源码贴出来
try {
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
LinkedMultiValueMap result = new LinkedMultiValueMap();
while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
Iterator var6 = properties.entrySet().iterator();
可以清楚的看到我们的配置文件是装在META-INF/spring.factories里的,这时,我们选择到具体包下去查看:
我找了spring.factories下的一个类:
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
然后conditional就是这个类生效的条件,当他的star启动后,满足conditional后的条件就会生效