SpringBoot自动配置机制
SpringBoot自动配置的内容有: 相关模块的集成配置,包扫描规则, 常见属性的默认值。
1. 自动集成Tomcat、SpringMVC等
以前项目中整合Web,Tomcat需要一系列的配置,比如DispatcherServlet、ViewResolver、CharacterEncodingFilter...
现在使用SpringBoot就已经默认配置好了,下面代码验证SpringBoot的容器中是否有这些Bean对象:
java
public static void main(String[] args) {
//java10: 局部变量类型的自动推断
var ioc = SpringApplication.run(MainApplication.class, args);
//1、获取容器中所有组件的名字
String[] names = ioc.getBeanDefinitionNames();
//2、挨个遍历:
// dispatcherServlet、beanNameViewResolver、characterEncodingFilter、multipartResolver
// SpringBoot把以前配置的核心组件现在都给我们自动配置好了。
for (String name : names) {
System.out.println(name);
}
}
2. 默认的包扫描规则
SpringBoot默认会扫描主程序所在的目录及其下面的子包,其中主程序为@SpringBootApplication
注解的启动类。
自定义扫描路径有两种:
- 在
@SpringBootApplication
注解中使用scanBasePackages
属性,指定扫描的路径即可。 - 使用
@ComponentScan
注解中使用basePackages
属性,指定扫描的路径即可。
3. 配置默认值
配置文件的所有配置项是和某个类的对象值进行一一绑定的,绑定了配置文件中每一项值的类称为属性类。 比如:
ServerProperties
绑定了所有Tomcat服务器有关的配置MultipartProperties
绑定了所有文件上传相关的配置
如需修改属性配置具体项,可以参照官方文档 或者参照源码SpringBoot绑定的属性类。
4. 按需加载自动配置
原理: SpringBoot的starter包引入都会默认引入spring-boot-starter
, 它是所有starter的starter,基础核心starter。spring-boot-starter
会引入一个包spring-boot-autoconfigure
, spring-boot-autoconfigure
里面都是各种场景的AutoConfiguration自动配置类。
虽然全场景的自动配置都在spring-boot-autoconfigure
这个包,但是不是全都开启的。导入哪个starter包就开启哪个自动配置。
总结
导入某个starter包就会触发spring-boot-autoconfigure
对应这个包的相关自动配置生效, SpringBoot中就会具有相关的功能
5. 自动配置流程
自动配置流程细节梳理:
- 当导入starter-web依赖:也就是导入了web-starter包
- web-starter包导入了相关场景的所有依赖:starter-json、starter-tomcat、springmvc
- 每个starter都引入了一个
spring-boot-starter
,核心场景starter。 - 核心starter引入了
spring-boot-autoconfigure
包。 spring-boot-autoconfigure
里面囊括了所有场景的所有配置。- 只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了。
- SpringBoot默认却扫描不到
spring-boot-autoconfigure
下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包。
- 主程序:
@SpringBootApplication
@SpringBootApplication
由三个注解组成:@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
- SpringBoot默认只能扫描自己主程序所在的包及其下面的子包,扫描不到 spring-boot-autoconfigure包中官方写好的配置类
@EnableAutoConfiguration
:是SpringBoot能够开启自动配置的核心。
a. 底层是由@Import(AutoConfigurationImportSelector.class)
提供功能:批量给容器中导入组件。
b. SpringBoot启动会默认加载146个配置类。
b. 这146个配置类来自于spring-boot-autoconfigure
下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件指定的- 项目启动的时候利用@Import批量导入组件机制把autoconfigure包下的146xxxxAutoConfiguration类导入进来(自动配置类)
- 虽然导入了146个自动配置类, 按需生效:
a. 并不是这146个自动配置类都能生效
b. 每一个自动配置类,都有条件注解@ConditionalOnxxx
,只有条件成立,才能生效
- xxxxAutoConfiguration自动配置类
- 给容器中使用@Bean 放一堆组件。
- 每个自动配置类都可能有这个注解
@EnableConfigurationProperties(ServerProperties.class)
,用来把配置文件中配的指定前缀的属性值封装到xxxProperties属性类中, 以Tomcat为例:把服务器的所有配置都是以server开头的。配置都封装到了属性类中。 - 给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是和配置文件绑定。
- 只需要改配置文件的值,核心组件的底层参数都能修改
- 写业务,全程无需关心各种整合(底层这些整合写好了,而且也生效了) SpringBoot启动dubug, 可以看到备选的配置类有146个: