SpringBoot 2x 系列之(四)自动配置
自动配置
1. 引导加载自动配置类
见 Spring Boot 1.md 一、SpringBoot 入门 4.2 主程序类,主入口类【自动配置原理】
1.1 @SpringBootConfiguration
见 Spring Boot 1.md 一、SpringBoot 入门 4.2 主程序类,主入口类【自动配置原理】
1.2 @EnableAutoConfiguration
1.2.1 @AutoConfigurationPackage
指定了默认的包规则
1.2.1.1 @Import(AutoConfigurationPackages.Registrar.class)
见 Spring Boot 1.md 一、SpringBoot 入门 4.2 主程序类,主入口类【自动配置原理】
利用Registrar给容器中批量注册组件,注册的是主配置类(@SpringBootConfiguration标注的类)的所在包及下面所有子包里面的所有组件
1.2.2 @Import(AutoConfigurationImportSelector.class)
利用Selector给容器中批量注册组件【按需注册】,注册的是spring-boot-autoconfigure-2.3.4.RELEASE.jar包里的META-INF/spring.factories文件org.springframework.boot.autoconfigure.EnableAutoConfiguration项的值
META-INF/spring.factories文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
1.3 @ComponentScan
指定要扫描的包
2. 按需开启自动配置项
虽然我们127个场景的所有自动配置启动的时候默认全部加载。
按照条件装配规则(@Conditional),最终会按需配置【导了相应的包,才会有需要的类,有了对应的类,相应的自动配置才会生效】。
@ConditionalOnWebApplication(type = Type. SERVLET):当前应用是否为Servlet原生类型【与之对应的还有响应式类型的,SpringBoot2支持两种Web模式开发】的Web应用
@AutoConfigureOrder( Ordered. HIGHEST_ PRECEDENCE):指定优先级,先生效还是后生效
@AutoConfigureAfter( ServletWebServerFactoryAutoConfiguration.class ):在ServletWebServerFactoryAutoConfiguration配置完之后再配置当前类
@ConditionalOnClass( ServletRegistration. class):系统中有没有这个ServletRegistration类型的组件
//给容器中加入了文件上传解析器;
@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}
3. 定制化配置
总结:
-
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
-
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
-
生效的配置类就会给容器中装配很多组件
-
只要容器中有这些组件,相当于这些功能就有了
-
定制化配置
-
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么配置项就去修改。
xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties
4. 最佳实践【SpringBoot应用如何编写】
-
引入场景依赖
-
查看自动配置了哪些(选做)
-
- 自己分析,引入场景对应的自动配置一般都生效了
- 配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效)
-
是否需要修改
-
- 参照文档修改配置项
-
-
- https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties
- 自己分析。xxxxProperties绑定了配置文件的哪些前缀。
-
-
- 自定义加入或者替换组件
-
-
- @Bean、@Component......
-
-
- 自定义器 XXXXXCustomizer;
- ......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术