ConditionalOnProperty是用来根据配置文件中的信息的配置情况,选择是否加载当前配置类的注解。
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
/**
* name字段别名
*/
String[] value() default {};
/**
* 应该应用于每个属性的前缀。如果未指定,前缀会自动以点结尾。
* 有效前缀由一个或多个用点分隔的单词定义(例如 {@code "acme.system.feature"})。
*/
String prefix() default "";
/**
* 要测试的属性的名称。如果已定义前缀,则将其应用于计算每个属性的完整键。
* 例如,如果前缀是 {@code app.config} 并且一个值是 {@code my-value},
* 则完整键将是 {@code app.config.my-value} 使用虚线表示法指定每个属性都是小写的,
* 用“-”分隔单词(例如 {@code my-long-property})。
*/
String[] name() default {};
/**
* 属性的预期值的字符串表示形式。如果未指定,则该属性必须不等于false。
*/
String havingValue() default "";
/**
* 如果未设置属性,则指定条件是否应匹配。默认为 {@code false}。
*/
boolean matchIfMissing() default false;
}
使用方法
- name和value不能都为空,也不能都有值;
- 如果配置了prefix,在匹配时的属性名为prefix+name;
- 如果配置文件(eg: application.yml)中不包含属性名name,且matchIfMissing为false,返回false;
- 如果配置文件(eg: application.yml)中不包含属性名name,且matchIfMissing为true,返回true;
- 如果配置文件(eg: application.yml)中包含属性名name,且配置了havingValue,比较属性名name对应的属性值和havingValue是否相等,相等返回true,否则返回false;
- 如果配置文件(eg: application.yml)中包含属性名name,且没有配置havingValue,比较属性名name对应的属性值是否等于字符串false,相等返回false,否则返回true;
- 循环以上判断,有一项为false,则@Conditional不成立。这不会加载这个配置项。