@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
// ...
}
@Configuration 表示当前是一个配置类
指定扫描哪些包。
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// ...
}
自动配置包,指定默认的包规则
// @Import 给容器中导入一个组件
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
// ...
}
利用 Register
给容器导入一系列组件。
将指定的一个包下的所有组件导入进来。主程序类 SpringbootReviewRecordsApplication
所在的包下。
getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)
给容器批量导入一些组件。List configurations = getCandidateConfigurations(annotationMetadata, attributes);
获取所有需要导入到容器中的类。Map> loadSpringFactories(ClassLoader classLoader)
得到所有的组件。"META-INF/spring.factories"
位置开始加载文件。
META-INF/spring.factories
位置的文件spring-boot-autoconfigure-2.7.3.jar
包下的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中的。SpringBoot 一启动,就要给容器中加载该文件中的所有配置类。默认加载全部组件,最终会按需配置。
可以使用 @ConditionalOnProperty
或者 @ConditionalOnClass
等条件注解实现按需配置。
@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;
}
xxxxAutoConfiguration
XXXXProperties
里面拿,和配置文件进行绑定。key
,然后修改配置文件的值xxxxAutoConfiguration
→
\to
→ 组件
→
\to
→ XXXXProperties
→
\to
→ application.properties / application.yml