一、引导加载自动配置类
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
}
1.SpringBootConfiguration
证明这是一个配置类
2.ComponentScan
指定扫描那些,Spring注解
3.EnableAutoConfiguration
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
}
3.1 AutoConfigurationPackage
@Import({AutoConfigurationPackages.Registrar.class})
public @interface AutoConfigurationPackage {
}
利用Registrar给容器中导入一系列组件:将MainApplication所在包下的组件
3.2 Import({AutoConfigurationImportSelector.class})
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List configurations =getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
重要3、利用工厂加载 Map<String, List> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
二、按需开启自动配置项
虽然我们127个场景的所有自动配置启动的时候默认全部加载。
xxxxAutoConfiguration按照条件装配规则(@Conditional),最终会按需配置。
三、修改默认配置
SpringBoot默认会在底层配好所有的组件,但是如果用户自己配置,以用户的优先
重要定制化配置的方法:
1.用户直接自定义组件@Bean
2.用户去看这个组件是获取的配置文件什么值就去修改
xxxxAutoConfiguration-->组件-->xxxxProperties里面拿值-->application.properties
四、最佳实践
- 导入场景依赖 spring-boot-starter-*
- 查看自动配置项 debug=True
- 是否需要修改:参照文档修改配置项
- 自定义加入或者替换组件
五、总结
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。