[学习记录] SpringBoot 3. 自动配置

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 {
	// ...
}

@Import 高级用法

利用 Register 给容器导入一系列组件。
将指定的一个包下的所有组件导入进来。主程序类 SpringbootReviewRecordsApplication 所在的包下。

1.3.2 @Import(AutoConfigurationImportSelector.class)
  1. 利用 getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) 给容器批量导入一些组件。
  2. 调用 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); 获取所有需要导入到容器中的类。
  3. 利用工厂加载 Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) 得到所有的组件。
  4. "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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇咔咔负负得正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值