SpringBoot中@ConditionalOnProperty的使⽤⽅法
前⾔
在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 = "ding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
// 省略内部代码spring怎么读取properties
}
DataSourceConfiguration类中部分代码:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(at.jdbc.pool.DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "pe", havingValue = "at.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 {};
// 配置属性名称的前缀,⽐如ding
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的⾃动配置在配置⽂件为:
pe=at.jdbc.pool.DataSource
在matchIfMissing为false时,如果name值为空,则返回false;如果name不为空,则将该值与havingValue指定的值进⾏⽐较,如果⼀样则返回true,否则返回false。返回false也就意味着⾃动配置不会⽣效。
但是如果看HttpEncodingAutoConfiguration类上的属性配置发现并没有完全按照上⾯所说的name和havingValue配合使⽤。它是通过“prefix+value”作为属性的名称来进⾏配置:
abled=true
其中prefix指定了配置的统⼀前缀“ding”,⽽value指定了具体的属性名称为“enabled”。这⾥并没有设置havingValue的值,如果havingValue未指定值,默认情况下在属性配置中设置的值为true则⽣效(如上配置),false则不⽣效。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。