pom.xml
启动器
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
springboot 所有的功能场景 ==> 对应的启动器
主程序
@SpringBootApplication //标注 springboot应用 启动类下的所有资源被导入
public class Springboot01HelloworldApplication {
public static void main(String[] args) {
//通过反射加载该类的对象
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
点进去看,发现两个核心注解
@SpringBootConfiguration springboot配置注解
@EnableAutoConfiguration 自动配置注解
首先来看 @SpringBootConfiguration springboot配置注解
点进去发现 @Configuration 这是一个配置类
再点进去 @Component 这其实是一个spring组件
再看 @EnableAutoConfiguration 自动配置注解
发现自动配置包注解 @AutoConfigurationPackage
自动配置选择器 @Import({AutoConfigurationImportSelector.class})
点开自动配置包注解 @AutoConfigurationPackage发现导入了一个注册器 @Import({Registrar.class})
再点开自动配置选择器 @Import({AutoConfigurationImportSelector.class}) 这是核心
重点在于 (自动加载配置器实体)getAutoConfigurationEntry()这个方法
发现(获取候选配置)getCandidateConfigurations()这个方法,追进去
这个方法获取了所有加载的配置方法SpringFactoriesLoader.loadFactoryNames(),加载了两个方法,重点看(获取spring工厂加载工厂类)getSpringFactoriesLoaderFactoryClass()这个方法,发现它获取了自动配置注解@EnableAutoConfiguration的类
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
而springboot的主启动类@SpringBootApplication
继承了这个自动配置注解@EnableAutoConfiguration
绕了这么大一圈,它做了一件事情,就是导入启动类下所有资源,此外
如果配置不为空,就会去 (自动配置的核心文件)META-INF/spring.factories 寻找配置文件
but 2.7版本的springboot自动配置文件在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
but spring.factories仍然可以使用,后续可能会废除
现在看下它是怎么加载配置文件的 追进 SpringFactoriesLoader.loadFactoryNames
这个方法就是从核心配置文件 META-INF/spring.factories 或系统文件中循环获取该配置文件中的所有配置,遍历出来封装成properties以供使用
注意:springboot所有自动配置都在启动时扫描并加载,spring.factories所有的自动配置类都在里面,只有导入对应的启动器,满足条件(@ConditionalOnXXX),自动配置才会生效。