千家信息网

SpringBoot中@ConditionalOnProperty怎么用

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,小编给大家分享一下SpringBoot中@ConditionalOnProperty怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起
千家信息网最后更新 2025年11月08日SpringBoot中@ConditionalOnProperty怎么用

小编给大家分享一下SpringBoot中@ConditionalOnProperty怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Spring Boot中的使用

在Spring Boot的源码中,比如涉及到Http编码的自动配置、数据源类型的自动配置等大量的使用到了@ConditionalOnProperty的注解。

HttpEncodingAutoConfiguration类中部分源代码:

@Configuration(proxyBeanMethods = false)@EnableConfigurationProperties(HttpProperties.class)@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)@ConditionalOnClass(CharacterEncodingFilter.class)@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)public class HttpEncodingAutoConfiguration { // 省略内部代码}

DataSourceConfiguration类中部分代码:

@Configuration(proxyBeanMethods = false)@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)static class Tomcat { // 省略内部代码}

很显然,以上两个自动配置类中都通过@ConditionalOnProperty来控制自动配置是否生效,下面我们来了解一下它的源码和具体使用。

@ConditionalOnProperty源码说明

@ConditionalOnProperty注解类源码如下:

@Retention(RetentionPolicy.RUNTIME)@Target({ ElementType.TYPE, ElementType.METHOD })@Documented@Conditional(OnPropertyCondition.class)public @interface ConditionalOnProperty { // 数组,获取对应property名称的值,与name不可同时使用 String[] value() default {}; // 配置属性名称的前缀,比如spring.http.encoding String prefix() default ""; // 数组,配置属性完整名称或部分名称 // 可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用 String[] name() default {}; // 可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置 String havingValue() default ""; // 缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效 boolean matchIfMissing() default false;}

其中在历史版本中还存在一个relaxedNames属性:

//是否可以松散匹配boolean relaxedNames() default true;

最新版本中已经不存在该属性了。

通过注解ConditionalOnProperty上的@Conditional(OnPropertyCondition.class)代码,可以看出ConditionalOnProperty属于@Conditional的衍生注解。生效条件由OnPropertyCondition来进行判断。

使用方法

关于@ConditionalOnProperty的使用方法,我们在上面的Spring Boot中的使用已经看到。

@ConditionalOnProperty的核心功能是通过属性name以及havingValue来实现的。

首先看matchIfMissing属性,用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissing为false,也就是说如果未进行属性配置,则自动配置不生效。如果matchIfMissing为true,则表示如果没有对应的属性配置,则自动配置默认生效。

下面看name属性,name用来从application.properties中读取某个属性值。比如上面Tomcat的自动配置在配置文件为:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

在matchIfMissing为false时,如果name值为空,则返回false;如果name不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true,否则返回false。返回false也就意味着自动配置不会生效。

但是如果看HttpEncodingAutoConfiguration类上的属性配置发现并没有完全按照上面所说的name和havingValue配合使用。它是通过"prefix+value"作为属性的名称来进行配置:

spring.http.encoding.enabled=true

其中prefix指定了配置的统一前缀"spring.http.encoding",而value指定了具体的属性名称为"enabled"。这里并没有设置havingValue的值,如果havingValue未指定值,默认情况下在属性配置中设置的值为true则生效(如上配置),false则不生效。

以上是"SpringBoot中@ConditionalOnProperty怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

配置 属性 名称 代码 注解 源码 篇文章 部分 相同 使用方法 内容 前缀 同时 情况 数组 文件 方法 版本 组合 松散 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 ipad怎么清理数据库 万字数据库是啥意思 江苏办公系统软件开发哪家好 服务器内存主要作用是 科技中国互联网 数据库设计 技术路线 三级网络技术真题视频讲解 两个人怎么进同一个方舟服务器 亚马逊 设计 服务器 盘灵古域服务器手机怎么玩 服务器 远程重装 浦东新区银联数据库服务商内容 开平区信息网络技术质量保证 我的世界服务器怎么弄冒险指令 大型工程没有数据库表 软件开发去外企 北京考拉在线网络技术是干什么的 天迈科技属于互联网公司吗 宜兴微型计算机网络技术推广设备 使用哪个数据库 海康pms系统提示连接数据库 网吧玩坦克世界服务器掉线 服务器市场占有率第一的上市公司 威海网络安全知识 数据库系统融入思想政治 软件开发这点事儿 数据库上下文类的主要作用 w3af网络安全吗 服务器电源亮黄灯是什么意思 新炬网络技术 上市
0