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应用如何编写】

posted @   刘二水  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示