来源
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
源码
package org.springframework.boot.autoconfigure.condition;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Conditional;
import org.springframework.core.env.Environment;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
String[] value() default {};//字符串数组,获取对应property名称的值,与name不可同时使用
String prefix() default "";//property名称的前缀,如:my.mq
String[] name() default {};//字符串数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用
String havingValue() default "";可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
boolean matchIfMissing() default false;缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错
boolean relaxedNames() default true;//是否可以松散匹配。 默认为{@code true}。
}
作用
spring boot通过注解@ConditionalOnProperty来控制注解@Configuration修饰的配置类是否生效
使用说明
通过对比name和havingValue的值来判断是否生效configuration配置类
name来自于application.propertie指定的值,与prefix指定的前缀结合组合完整的property使用
如果name为空则返回false,不为空则与havingValue的值进行比较,相同则返回true且configuration生效,不相同则返回false且configuration不生效
举例
/*
* @Desc : 比较application.properties中配置的my.mq.clientType值是否与havingValue的值ons相同,如果相同则该配置类生效
*/
@Configuration
@ConditionalOnProperty(
prefix = "my.mq",
name = {"clientType"},
havingValue = "ons",
matchIfMissing = true
)
public class OnsAutoConfig {
@Autowired
private ListenerContainer container;
@Autowired
private OnsPublisherHolder onsPublisherHolder;
@Autowired
private OnsConsumerInitiator onsConsumerInitiator;
public OnsAutoConfig() {
}
@PostConstruct
private void onsStartUp() {
this.container.init();
this.onsPublisherHolder.init();
this.onsConsumerInitiator.onConsumerStartUp(this.container.getListeners());
}
}