使用@ConditionalOnProperty注解,控制bean是否注入容器中

2020-10-032355

背景:

我们有需求控制某个bean是否注入容器,比如有一个controller只是在开发时用于测试,当项目上线后要把他禁用掉,自己手动删除这个controller是可以,但是如果有很多个这样的controller手动删除未免太麻烦了,如何通过配置文件的某一属性值来控制某些bean是否注入到容器中?

方法:

使用@ConditionalOnProperty注解,控制bean是否注入容器中

该注解属性解析:

首先看matchIfMissing属性,用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissing为false,也就是说如果未进行属性配置,则自动配置不生效。如果matchIfMissing为true,则表示如果没有对应的属性配置,则自动配置默认生效。

name属性用来从application.properties中读取某个属性值。

在matchIfMissing为false时,如果name值为空,则返回false;如果name不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true,否则返回false。返回false也就意味着自动配置不会生效。

例子:

1.png

上面的代码意思是,看看配置文件里有没有配置dev-active属性,并且值要等于true,如果满足则该controller会注入到容器中,否则不会注入,如果配置文件中没有这个属性,因为配置了matchIfMissing = false(默认也是false,可不用配置),该controller也不会注入到容器中。

2.png

这样就可以通过配置文件的某一个属性控制bean是否注入到容器当中,这时再搭配上不同的生产环境生效不同的配置文件,就可以轻松根据环境来控制开放不同的接口。

底层原理:

@ConditionalOnProperty注解是spring boot的注解,底层也是使用spring的原生注解@Conditional({OnPropertyCondition.class})

判断是否要注入的规则在OnPropertyCondition.class中定义。

分享
点赞1
打赏
上一篇:Docker常用命令笔记(一)
下一篇:谈谈嘻哈