Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot中@ConditionalOnProperty使用详解

Spring Boot中@ConditionalOnProperty使用详解

作者头像
程序新视界
发布于 2019-12-20 08:22:48
发布于 2019-12-20 08:22:48
4K00
代码可运行
举报
文章被收录于专栏:丑胖侠丑胖侠
运行总次数:0
代码可运行
在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能。

Spring Boot中的使用

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

HttpEncodingAutoConfiguration类中部分源代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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类中部分代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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注解类源码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//是否可以松散匹配
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的自动配置在配置文件为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.http.encoding.enabled=true

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

原文链接:《SPRING BOOT中@CONDITIONALONPROPERTY使用详解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
五分钟说清楚 Spring Boot的自动配置原理
Spring Boot没有火起来之前,使用SSM架构的项目那是相当的多,现在也有不少项目还是使用这种架构。在使用SSM架构的时候,大家是否还记得大量配置的烦恼郁闷,各种配置,搞得人都不是很爽。各种配置扫描,如果想添加一个新的依赖,还得添加各种配置。这种大量配置的工作不进浪费时间,最主要的是会产生各种坑。
田维常
2021/02/25
7830
五分钟说清楚 Spring Boot的自动配置原理
springboot的自动配置原理/步骤
1、SpringBoot启动的时候加载主配置类(@SpringBootApplication),开启了自动配置功能 @EnableAutoConfiguration。
全栈程序员站长
2022/09/06
7890
springboot的自动配置原理/步骤
Spring Boot 自动配置一篇概览
因为 @AutoConfiguration 注解本身是以 @Configuration 注解的,所以自动配置类可以算是一个标准的基于 @Configuration 注解的类。
WindWant
2023/05/29
2960
第四章 :springBoot自动配置原理,加载过程
可以把上面的注解一级一级点进去,在AutoConfigurationImportSelector的类中有个下面的方法:
全栈程序员站长
2022/08/09
1K0
第四章 :springBoot自动配置原理,加载过程
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
前面的博文,我们从源码角度介绍了自动装配流程。虽然带大家从整体上有了清晰的认识,但是我们还不能熟练地运用。
huazie
2024/05/11
1820
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
@Conditional 条件装配的解释
如果要具体使用某一个注解达到条件注入的目的,还请大家自行百度 这里仅提供一个@ConditionalOnProperty的使用
名字是乱打的
2021/12/23
3870
@Conditional 条件装配的解释
Spring Boot自动配置原理,你必须懂
小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题,各种排除扫描,导入一个新的依赖又得添加新的配置。自从有了 Spring Boot 之后,咋们就起飞了!各种零配置开箱即用,而我们之所以开发起来能够这么爽,自动配置的功劳少不了,今天我们就一起来讨论一下 Spring Boot 自动配置原理,看完心里有个大概,不至于被面试官问的面红耳赤。
南风
2019/10/10
1.2K0
Spring Boot自动配置原理,你必须懂
Spring Boot 自动配置原理
SPI:  Service Provider Interface , 即 服务提供接口
磊叔的技术博客
2025/06/07
1380
Spring Boot 自动配置原理
SpringBoot数据库配置源码解析:自动配置内部实现解析
上节我们了解了 DataSourceAutoConfiguration 自动配置的注解部分,本节继续深入讲解该类中的内部实现。
愿天堂没有BUG
2022/10/28
1.6K0
SpringBoot数据库配置源码解析:自动配置内部实现解析
Spring boot常用注解收集
无论是xml配置、java注解配置,都称为配置元数据,所谓元数据即描述数据的数据。元数据本身不具备任何可执行的能力,只能通过外界代码来对这些元数据解析后进行一些有意义的操作。Spring容器解析这些配置元数据进行Bean初始化、管理等。
微观技术
2020/08/20
4660
源码学习系列之SpringBoot自动配置(篇二)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
SmileNicky
2019/11/18
3110
初探 SpringBoot 自动装配
在不使用 SpringBoot 的时候,如果我们需要一个类必须要将它放到 Spring 的容器中,但是使用了 SpringBoot 之后就算我们不配置,仅仅是导入 jar 包就可以直接从容器中获取类了,这是怎么实现的呢?
wsuo
2020/07/30
4130
初探 SpringBoot 自动装配
SpringBoot详解
SpringBoot实质上是Spring与SpringMVC的再度封装,对一些常见的应用场景进行了默认的配置,使得开发者在使用SpringBoot进行开发的时候无需编写复杂的配置文件,我们可以从项目的运行日志中发现一些信息:
wangweijun
2023/12/01
8550
SpringBoot运作原理之@Conditional
在《SpringBoot运作原理解析之加载AutoConfiguration》中我们已经介绍了SpringBoot对配置文件的加载及相应类的实例化操作。那么,SpringBoot是如何之后该实例化哪些类的呢?这篇文章带大家了解一下@Conditional注解及其发挥的作用。
程序新视界
2019/05/26
1.5K0
SpringBoot-04 自动配置原理
我们以**HttpEncodingAutoConfiguration(Http编码自动配置)**为例解释自动配置原理;
张小驰出没
2021/04/15
9450
SpringBoot-04 自动配置原理
spring boot自动配置原理
1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能 ==@EnableAutoConfiguration==
程序员阿杜
2021/03/15
8870
spring boot自动配置原理
Spring Boot - 自动配置实例解读
Spring Boot - 自动配置实现原理中我们说了自动装配的原理,这里我们继续接着说,用一个自动装配的例子,来感受下Spring Boot 的魅力
小小工匠
2021/08/17
6200
Spring Boot - 自动配置实例解读
SpringBoot - 05. 数据访问之JDBC(源码分析+代码下载)
JDBC API 属于Java APIJDBC用于以下几种功能:连接到数据库、执行SQL语句
悟空聊架构
2020/03/05
8960
SpringBoot - 05. 数据访问之JDBC(源码分析+代码下载)
SpringBoot中的@Conditional注解
在Spring的应用下,我们希望一些bean可以通过一些条件来判断是否需要实例化,并加载到spring容器中。
半月无霜
2023/03/03
5310
SpringBoot中的@Conditional注解
Spring Boot 从入门到实践系列教程(3)- Spring注解
在本快速教程中,我们将探讨org.springframework.boot.autoconfigure和org.springframework.boot.autoconfigure.condition包中的注释。
王炸
2019/07/02
5550
相关推荐
五分钟说清楚 Spring Boot的自动配置原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验