[学习记录] 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 configurations = getCandidateConfigurations(annotationMetadata, attributes); 获取所有需要导入到容器中的类。
  3. 利用工厂加载 Map> 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

你可能感兴趣的:(Spring,Boot,spring,boot,学习,spring)