前言
避免重复造轮子,就要自己动手写一下公共组件,或者公共类对外提供插件功能。有时候会有用不到的的一些配置类,想通过一个配置来实现开关。
问题来了,该怎么通过配置文件来实现是否注入呢?
今天的主角@ConditionalOnProperty就是用来实现这一目的的。
@ConditionalOnProperty使用方法
在S p r i n g B o o t中有的时候需要控制配置类是否生效,可以用我们的@ConditionalOnProperty注解来标记@Configuration是否生效.
具体代码如下:
@Configuration
@ConditionalOnProperty(name = mqVender.mq_info, havingValue = "rabbitMq")
public class RabbitMQBeanProcessor implements BeanDefinitionRegistryPostProcessor {
// TODO 具体的代码及逻辑实现
}
@ConditionalOnProperty源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
String[] value() default {};
String prefix() default "";
String[] name() default {};
String havingValue() default "";
boolean matchIfMissing() default false;
}
属性含义
我们来看一下各个属性的含义是什么
value:他是用来获取对应property名称的值,但是,与name不可同时使用
prifix:他是配置属性名称的前缀
name:他会读取application.yml文件中的配置(mqVender.mq_info)的内容,他有两个注意事项,分别如下:
1)、配置属性的完整名称或者是部分名称;
2)、可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用
havingValue: 他可以与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才会去加载配置
matchIfMissing:缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效
使用逻辑
havingValue为空的时候:
属性值为boolean类型,则属性值为true 加载该bean,属性值为false 不加载该bean。
如果属性值不为boolean类型,则有该属性 则加载bean,没有该属性则不加载。
demo
属性值不是boolean类型
@Configuration
@ConditionalOnProperty(name = aaa)
public class RabbitMQBeanProcessor implements BeanDefinitionRegistryPostProcessor {
// TODO 具体的代码及逻辑实现
}
配置了该属性,则就会去加载
aaa=不为空
属性值为boolean类型
@Configuration
@ConditionalOnProperty(name = enable)
public class RabbitMQBeanProcessor implements BeanDefinitionRegistryPostProcessor {
// TODO 具体的代码及逻辑实现
}
enable = true
当enable为true的时候加载,当他为false的时候则不加载
欢迎大家点击下方卡片,关注《coder练习生》