自动配置:
pom.xml
spring-boot-dependencies
:核心依赖在父工程中!
我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本库.
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Springboot会将大部的分常用功能场景,封装成一个个的启动器
比如`:
<artifactId>spring-boot-starter-web</artifactId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<artifactId>spring-boot-starter-tomcat</artifactId>
对应的启动器会帮我们导入所以相关的依赖!!!
我们要用什么功能,只需要找到对应的启动器添加进来.
主程序
注解(第一层)
@SpringBootApplication
(标注这是一个Springboot应用)
内集成了多个注解(主要是下面三个)
第二层
@SpringBootConfiguration
(springboot配置)
@EnableAutoConfiguration
(自动导包)
@ComponentScan
(包扫描,扫描当前主启动类同级的包)
第三层
//标注Springboot是一个spring组件
@SpringBootConfiguration
=>@Configuration
=>@Component
@EnableAutoConfiguration
(自动导包)
下面导入了两个核心注解
@AutoConfigurationPackage
(自动配置包)
@Import({AutoConfigurationImportSelector.class})
自动配置导入选择器
第四层
@AutoConfigurationPackage
(自动配置包)
下面导入一个自动注册器
@Import({Registrar.class})
(自动注册器)
@Import({AutoConfigurationImportSelector.class})
有两个方法:
getAutoConfigurationEntry
(自动导入实体类)
getCandidateConfigurations
(获取候选的配置)
第五层
getAutoConfigurationEntry
(自动导入实体类)
调用
getCandidateConfigurations
(获取候选的配置)
获取到
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
第六层
getCandidateConfigurations
(获取候选的配置)
调用下面方法获取所有的候选配置名称
loadFactoryNames()
loadFactoryNames() 调用了 loadSpringFactories()
loadSpringFactories()
方法
Enumeration<URL> urls = classLoader != null ?
//获取项目资源
classLoader.getResources("META-INF/spring.factories") :
//获取系统资源
ClassLoader.getSystemResources("META-INF/spring.factories");
思考:这么多自动配置为什么又得没有生效,需要导入对应得start才能有作用!
因为loadSpringFactories
方法遍历这些自动配置文件的时候,会去判断带有:
@ConditionalOnXXX
注解的条件是否满足类似@ConditionalOnClass
如果这里的条件都满足才会生效
结论,springboot所有自动配置都是在启动的时候扫描并加载.
1.Springboot在启动的时候,从类路径下/META-INF/spring.factpries
获取指定的值!
2.将这些自动配置的类导入容器,自动配置就会生效,进行自动配置!
3.以前在SSM框架,需要我们手动配置的东西,现在springboot帮我们做了.
4.整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.7.RELEASE.jar
5.它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器中.
6.容器中也会存在非常多的XXXAutoConfigration的文件(@Bean)
Run方法执行流程图: