文档章节

Spring Boot中@ConditionalOnProperty使用详解

程序新视界
 程序新视界
发布于 2019/12/09 15:59
字数 932
阅读 22
收藏 0

在Spring Boot的自动配置中经常看到@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则不生效。

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


<center><b>程序新视界</b>:精彩和成长都不容错过</center>

程序新视界-微信公众号

© 著作权归作者所有

程序新视界
粉丝 1
博文 73
码字总数 122414
作品 0
东城
私信 提问
Spring Boot 最核心的 25 个注解,都是干货!

学习和应用 Spring Boot 有一些时间了,你们对 Spring Boot 注解了解有多少呢?今天栈长我给大家整理了 Spring Boot 最核心的 25 个注解,都是干货! 你所需具备的基础 什么是 Spring Boot?...

Java技术栈
2019/02/26
265
0
Spring Boot 最核心的 25 个注解

Spring Boot 最核心的 25 个注解 1、@SpringBootApplication 这是 Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能...

DemonsI
2019/05/18
95
0
Spring Boot 动态注入的两种方式

通过@Profile+spring.profiles.active spring.profiles.active: 官方解释是激活不同环境下的配置文件,但是实际测试发现没有对应的配置文件也是可以正常执行的。那就可以把这个key当作一个参...

MeiJM
2019/03/26
31
0
spring boot 之注解

@EnableAutoConfiguration 有这个注解,spring boot 就会根据classpat中的jar依赖,来猜测你将要开发一个什么样的spring应用。比如:spring-boot-starter-web这个依赖,则springboot就会自动...

乾坤刀
2018/05/31
0
0
编写自己的SpringBoot-starter

前言 原理 首先说说原理,我们知道使用一个公用的starter的时候,只需要将相应的依赖添加的Maven的配置文件当中即可,免去了自己需要引用很多依赖类,并且SpringBoot会自动进行类的自动配置。...

细节探索者
2019/04/03
38
2

没有更多内容

加载失败,请刷新页面

加载更多

今日头条技术架构分析,看这篇就对了!

点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Anywhere, it is a good in the past, recall the number of times many, all would be ligh......

吧主
1分钟前
0
0
影响K8S Pod分配和调度策略的两大关键特性

在Kubernetes中有一个最复杂的调度器可以处理pod的分配策略。基于在pod规范中所提及的资源需求,Kubernetes调度器会自动选择最合适的节点来运行pod。 但在许多实际场景下,我们必须干预调度过...

RancherLabs
3分钟前
0
0
Linux笔记

Linux常用命令之chmod修改文件权限777和754 示例:chmod 777 /etc/squid 运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行)。...

owenzhang24
7分钟前
0
0
教你如何在CentOS7系统上安装postgreSQL11

本文教你如何在CentOS7系统上安装postgreSQL11。 1.添加PostgreSQL Yum存储库 sudo yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-......

Linux就该这么学
14分钟前
9
0
欧盟将禁止公共场所人脸识别:谷歌支持,微软反对

   来源:新浪、VB   近日,彭博社披露的一份欧盟人工智能“白皮书”草案显示,欧盟计划对人工智能开发者提出具有法律约束力的新要求,以确保现代科技的开发和使用符合道德规范。    ...

水果黄瓜
18分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部