Spring Boot中如何正确运用@ConditionalOnProperty进行条件配置?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1185个文字,预计阅读时间需要5分钟。
前言:在Spring Boot的自动配置中,经常看到使用@ConditionalOnProperty注解的场景,本篇文章将带领大家深入理解该注解的功能。
Spring Boot使用@ConditionalOnProperty注解实现按需加载组件,以下是对该注解的详细介绍。
一、@ConditionalOnProperty注解的功能
@ConditionalOnProperty注解用于根据配置属性值条件性地执行配置。它允许你基于外部配置文件中的属性值来启用或禁用某些组件或功能。
二、@ConditionalOnProperty注解的语法
java@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Conditional(ConditionalOnPropertyCondition.class)public @interface ConditionalOnProperty {
String[] name() default {};
String[] havingValue() default {};
boolean matchIfMissing() default false;
Class value() default Object.class;}
三、参数说明
- name:要匹配的配置属性名称。- havingValue:配置属性对应的值,如果指定了此值,则只有当配置属性值与此值相同时,条件才成立。- matchIfMissing:当配置属性不存在时,是否满足条件。默认为false,表示必须存在该属性才能满足条件。- value:当所有条件都满足时,才会进行注解标记的配置。
四、示例
以下是一个示例,演示如何使用@ConditionalOnProperty注解根据配置文件中的属性值启用或禁用某些组件。
java@Configuration@ConditionalOnProperty(name=myapp.feature.enabled, havingValue=true)public class FeatureConfig { // ...}
在这个例子中,只有当`myapp.feature.enabled`配置属性的值为`true`时,`FeatureConfig`类才会被加载。
通过以上介绍,相信大家对@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 = "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则不生效。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易盾网络的支持。
本文共计1185个文字,预计阅读时间需要5分钟。
前言:在Spring Boot的自动配置中,经常看到使用@ConditionalOnProperty注解的场景,本篇文章将带领大家深入理解该注解的功能。
Spring Boot使用@ConditionalOnProperty注解实现按需加载组件,以下是对该注解的详细介绍。
一、@ConditionalOnProperty注解的功能
@ConditionalOnProperty注解用于根据配置属性值条件性地执行配置。它允许你基于外部配置文件中的属性值来启用或禁用某些组件或功能。
二、@ConditionalOnProperty注解的语法
java@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Conditional(ConditionalOnPropertyCondition.class)public @interface ConditionalOnProperty {
String[] name() default {};
String[] havingValue() default {};
boolean matchIfMissing() default false;
Class value() default Object.class;}
三、参数说明
- name:要匹配的配置属性名称。- havingValue:配置属性对应的值,如果指定了此值,则只有当配置属性值与此值相同时,条件才成立。- matchIfMissing:当配置属性不存在时,是否满足条件。默认为false,表示必须存在该属性才能满足条件。- value:当所有条件都满足时,才会进行注解标记的配置。
四、示例
以下是一个示例,演示如何使用@ConditionalOnProperty注解根据配置文件中的属性值启用或禁用某些组件。
java@Configuration@ConditionalOnProperty(name=myapp.feature.enabled, havingValue=true)public class FeatureConfig { // ...}
在这个例子中,只有当`myapp.feature.enabled`配置属性的值为`true`时,`FeatureConfig`类才会被加载。
通过以上介绍,相信大家对@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 = "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则不生效。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易盾网络的支持。

