前言
Spring系列的框架大大简化了后端的开发,同时还可以集成多种场景。但是会还不行,还得知道它是如何实现的,这样我们遇到什么bug之类的才能游刃有余的化解,或者定制自己的场景或配置。俗话说:知其然知其所以然。所以从自动配置原理出发,深究源码。
注解配置
@SpringBootApplication
从主程序入手,主程序首先要有 @SpringBootApplication注解作为主程序入口。
@SpringBootApplication接口里又有三个注解 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
@SpringBootApplication=
@SpringBootConfiguration+
@EnableAutoConfiguration+
@ComponentScan
1. @SpringBootConfiguration
@SpringBootConfiguration里面没有什么就是一个@Configuration,代表当前是一个配置类,重点是其他两个注解,往下看其具体功能
2. @ComponentScan
@ComponentScan指定扫描哪些,Spring注解;
3. @EnableAutoConfiguration
@EnableAutoConfiguration由
@AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class) 构成
@EnableAutoConfiguration =
@AutoConfigurationPackage+
@Import(AutoConfigurationImportSelector.class)
具体分析@AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class)注解功能
3.1 @AutoConfigurationPackage
@AutoConfigurationPackage导入Registrar组件
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
Registrar的作用:对主程序包下的bean批量注册
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文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories
获取导入的组件名
获取当前类加载器下的配置类
获取过程:
(虽然获得了其他包下也有META-INF/spring.factories,但是最后getOrDefault只获取当前类名下127个配置类组件)
3.3 特别说明:
(按需配置)
虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
但是会按照条件装配规则(@Conditional),最终会按需配置。
应用:
可以根据条件装配规则,自定义配置类,只要自己往容器里注册了对应的配置类,按照@ConditionalOnMissingBean规则,默认配置类就不会生效
例如:WebMvcAutoConfiguration
总结
@SpringBootApplication由三个主要注解构成
@EnableAutoConfiguration
: 启用Spring Boot 的自动配置机制@ComponentScan
@Component
:对应用程序所在的包启用扫描(见最佳实践)@SpringBootConfiguration
: 允许在上下文中注册额外的 bean 或导入额外的配置类。Spring 标准的替代方案@Configuration
,可帮助您在集成测试中进行配置检测。