ConditionalOnProperty 这个注解,可以用于控制某个业务组件,是否开启。
当我们在配置文件中加上enabled: true, 开启组件, 没有配置,默认关闭组件
这样我们可以定制化一个通用的模块,它是开,还是关,从而达到充分复用代码的目的。
比如我们封装好的一个核心Lib, 里面有各种MongoDB, Redis, Mysql ,还有各种外部服务,比如发邮件,发短信。
通常我们一个新业务来了,我总是希望能复用这些基础代码类库,但是如果直接引入进来,那就要加一万条配置,烦的一笔。
所以我们就利用了ConditionalOnProperty注解,实现了定制化,可以开、关业务组件。
比如我需要发邮件的时候,我就配置文件加一项,如果不需要,就关掉。
我们看一下配置长什么样子,在application.yml配置中
这里有个JDBC配置, 现在是开启状态。
我们看代码中
这个组件里面就用到了@ConditionalOnProperty注解,这个class里面有很多Bean,如果条件不满足,它就不会被启动加载, 当需要的时候,你只需要把参数改一下,就可以用了。
关于ConditionalOnProperty的规则,可以查看官方注释说明,以及示例。
@Conditional检查指定的属性是否具有特定值。 默认情况下,属性必须存在于环境中,并且不等于false。 具有havingValue()和matchIfMissing()属性允许进行进一步的自定义。
具有havingValue()属性可用于指定该属性应具有的值。 下表显示条件何时根据属性值和havingValue()属性匹配:
如果该属性根本不包含在环境中,则请查询matchIfMissing()属性。 默认情况下,缺少的属性不匹配。
此条件不能可靠地用于匹配收集属性。 例如,在以下配置中,如果环境中存在spring.example.values,则条件匹配,但如果存在spring.example.values [0],则条件不匹配。
@ConditionalOnProperty(prefix = "spring", name = "example.values") class ExampleAutoConfiguration { }
上面的例子 ,你最好换一下,换成自己的变量命名。