【Spring boot】自动配置的理论基础
本文结论
- SpringBoot的自动配置就是SpringBoot在源码中预先写好了一些配置类,预先定义好了一些Bean!
- 在使用SpringBoot时,这些配置类就已经在我们项目的依赖中了!
- 自动配置类或自动配置Bean是否生效,看具体所指定的条件!
在spring中有哪些配置
- 配置文件:类似端口号、数据库地址、用户名密码等
- 各种Bean:比如整合Mybatis需要配置的MapperFactoryBean,比如整合事务需要配置DataSourceTransactionManager...
自动配置做什么事情
- 核心是配置各种Bean。
- 对于配置文件来说,spring并不知道你的地址、密码、账号...这些值,所以spring不能进行自动配置。
- 对于服务端口号、中间件端口号...这些配置,spring boot中也会提供默认值。
spring boot中自动配置做了什么?
- Spring整合各种Servlet容器(Tomcat、Jetty)的Bean。
- Spring整合各种消息队列(RabbitMQ、Kafka、RocketMQ)的Bean。
- Spring整合各种数据库(MySQL、oracle)的Bean。
- Spring整合各种缓存(redis)的Bean。
- 等等
一些自动配置类
- ServletWebServerFactoryAutoConfiguration:配置了Servlet Web场景中所需要的一些Bean。
- TransactionAutoConfiguration:配置了事务场景中所需要的一些Bean。
- AopAutoConfiguration:配置了AOP场景中所需要的一些Bean。
- RabbitAutoConfiguration:配置了Rabbitmq场景中所需要的一些Bean。
- ...
自动配置类的生效控制方式:条件注解
- ConditionalOnBean:是否存在某个某类或某个名字的Bean。
- ConditionalOnMissingBean:是否缺失某个某类或某个名字的Bean。
- ConditionalOnSingleCandidate:是否符合指定类型的Bean只有一个。
- ConditionalOnClass:是否存在某个类。
- ConditionalOnMissingClass:是否缺失某个类。
- ConditionalOnExpression:指定的表达式返回的是true还是false。
- ConditionalOnJava:判断Java版本。
- ConditionalOnJndi:JNDI指定的资源是否存在。
- ConditionalOnWebApplication:当前应用是一个Web应用。
- ConditionalOnNotWebApplication:当前应用不是一个Web应用。
- ConditionalOnProperty:Environment中是否存在某个属性。
- ConditionalOnResource:指定的资源是否存在。
- ConditionalOnWarDeployment:当前项目是不是以War包部署的方式运行。
- ConditionalOnCloudPlatform:是不是在某个云平台上。
- Conditional:上面这些注解上都有这个@Conditional注解!
条件注解的作用域
- 条件注解是可以写在类上和方法上。
- 个条件注解写在了自动配置类上,那该自动配置类会不会生效就要看当前条件能不能符合。
- 条件注解写在某个@Bean修饰的方法上,那这个Bean生不生效就看当前条件符不符合。
条件注解的实现原理
- Spring在解析某个自动配置类时,会先检查该自动配置类上是否有条件注解,如果有,则进一步判断该条件注解所指定的条件当前能不能满足,如果满足了则继续解析该配置类,如果不满足则不进行解析了,也就是配置类所定义的Bean都得不到解析,也就是相当于没有这些Bean了。
- 同理,Spring在解析某个@Bean的方法时,也会先判断方法上是否有条件注解,然后进行解析,如果不满足条件,则该Bean不会生效。
- 处理条件注解的源码位置在:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent(MetadataReader)中的调用isConditionMatch(metadataReader);方法内部。
结束语
- 你的点赞是我提高文章质量最大的动力!!!
- 获取更多本文的前置知识文章,以及新的有价值的文章,让我们一起成为架构师!
- 目前已经完成了并发编程、MySQL、spring源码、Mybatis的源码。可以在公众号下方菜单点击查看之前的文章!
- 这个公众号的所有技术点,会分析的很深入!
- 这个公众号,无广告!!!
分类:
spring
, spring boot
标签:
spring
, spring boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现