SpringBoot 3. 自动配置
1. 引导加载自动配置类
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
// ...
}
1.1 @SpringBootConfiguration
@Configuration 表示当前是一个配置类
1.2 @ComponentScan
指定扫描哪些包。
1.3 @EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// ...
}
1.3.1 @AutoConfigurationPackage
自动配置包,指定默认的包规则
// @Import 给容器中导入一个组件
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
// ...
}
利用 Register 给容器导入一系列组件。
将指定的一个包下的所有组件导入进来。主程序类 SpringbootReviewRecordsApplication 所在的包下。
1.3.2 @Import(AutoConfigurationImportSelector.class)
- 利用
getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)给容器批量导入一些组件。 - 调用
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);获取所有需要导入到容器中的类。 - 利用工厂加载
Map<String, List<String>> loadSpringFactories(ClassLoader classLoader)得到所有的组件。 - 从
"META-INF/spring.factories"位置开始加载文件。- 默认扫描我们系统里面所有
META-INF/spring.factories位置的文件 - 我的是 2.7.3 版本的 SpringBoot,加载的组件是写死在
spring-boot-autoconfigure-2.7.3.jar包下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的。SpringBoot 一启动,就要给容器中加载该文件中的所有配置类。
- 默认扫描我们系统里面所有
2. 按需开启自动配置项
默认加载全部组件,最终会按需配置。
可以使用 @ConditionalOnProperty 或者 @ConditionalOnClass 等条件注解实现按需配置。
3. 修改默认配置
@Bean
// 容器中有 `MultipartResolver.class` 组件。
@ConditionalOnBean(MultipartResolver.class)
// 容器中没`DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME` 这个名字
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public MultipartResolver multipartResolver(MultipartResolver resolver) {
// 给 @Bean 注解的方法注入了对象参数,这个参数的值会从容器中找
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}
给容器中加入了文件上传解析器,SpringBoot 规范化,防止用户配置文件上传解析器不符合规范。
SpringBoot 进行默认配置,若用户自定义配置,SpringBoot 就按照用户的配置加载。
@Bean
// 若没有该组件
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
return filter;
}
4. 配置流程(约定大于配置)
- SpringBoot 先加载所有的自动配置类:
xxxxAutoConfiguration - 每个自动配置类按照条件生效,默认都会绑定配置文件指定的值:
XXXXProperties里面拿,和配置文件进行绑定。 - 用户有自己的配置,以用户优先
- 用户直接自己 @Bean 替换底层的组件
- 用户看组件获取什么
key,然后修改配置文件的值
xxxxAutoConfiguration
→
\to
→ 组件
→
\to
→ XXXXProperties
→
\to
→ application.properties / application.yml
1870

被折叠的 条评论
为什么被折叠?



