Spring Boot中@ConditionalOnProperty的使用方法
作者:SECBRO2 时间:2021-11-27 09:07:33
前言
在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则不生效。
来源:http://www.choupangxia.com/2019/12/09/spring-boot-conditionalonproperty/
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
springboot多模块化整合mybatis,mapper自动注入失败问题及解决
![](https://img.aspxhome.com/file/2023/8/60778_0s.jpg)
使用Java实现简单串口通信
![](https://img.aspxhome.com/file/2023/4/61134_0s.png)
Windows下安装ElasticSearch的方法(图文)
![](https://img.aspxhome.com/file/2023/2/60192_0s.png)
SpringBoot在Controller层接收参数的n种姿势(超详细)
![](https://img.aspxhome.com/file/2023/0/60600_0s.jpg)
Spring应用抛出NoUniqueBeanDefinitionException异常的解决方案
简单解析java方法在调用在内存中的执行过程
![](https://img.aspxhome.com/file/2023/6/59756_0s.png)
解析spring cloud ouath2中的Eureka
![](https://img.aspxhome.com/file/2023/6/61006_0s.png)
springmvc如何使用map接收参数
![](https://img.aspxhome.com/file/2023/9/60289_0s.png)
使用Spring Cloud Feign远程调用的方法示例
springcloud feign传输List的坑及解决
android分享纯图片到QQ空间实现方式
java设计模式之适配器模式
![](https://img.aspxhome.com/file/2023/4/59854_0s.jpg)
Java Timer使用讲解
Mybatis 动态SQL的几种实现方法
Java实现答答租车系统
![](https://img.aspxhome.com/file/2023/9/61579_0s.jpg)
mybatis多个区间处理方式(双foreach循环)
![](https://img.aspxhome.com/file/2023/2/59882_0s.png)
java实现单词小游戏
![](https://img.aspxhome.com/file/2023/2/59522_0s.png)
Android登录注册功能 数据库SQLite验证
![](https://img.aspxhome.com/file/2023/6/86926_0s.gif)
jdbc和mybatis的流式查询使用方法
java8新特性 stream流的方式遍历集合和数组操作
![](https://img.aspxhome.com/file/2023/0/60790_0s.jpg)