SpringBoot的@Conditional派生注解详解

一.派生注解的类型和作用

必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效

@Conditional                                       | 作用(判断是否满足当前指定条件)              

@ConditionalOnJava                           | 系统的java版本是否符合要求               
@ConditionalOnBean                          | 容器中存在指定Bean;                  
@ConditionalOnMissingBean              | 容器中不存在指定Bean;                 
@ConditionalOnExpression                 | 满足SpEL表达式指定                   
@ConditionalOnClass                          | 系统中有指定的类                      
@ConditionalOnMissingClass              | 系统中没有指定的类                     
@ConditionalOnSingleCandidate         | 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty                      | 系统中指定的属性是否有指定的值               
@ConditionalOnResource                    | 类路径下是否存在指定资源文件                
@ConditionalOnWebApplication           | 当前是web环境                      
@ConditionalOnNotWebApplication      | 当前不是web环境                     
@ConditionalOnJndi                              | JNDI存在指定项                     

二.派生注解的使用详情

1、@ConditionalOnProperty注解

这个注解用于检测Environment中的指定属性是否存在或等于某个指定的值。

如下图:
 


如havingValue属性没有指定的话,那么只要实际属性值不等于false,都算匹配成功。如果指定了,那就必须要一样才行。

matchIfMissing属性就是说,如果没有发现这个属性,算不算匹配上,设置为true就算,false就不算,默认为不算。

请看配置文件,如下图:
 


很明显,这是可以匹配上的,运行一下,结果如下图:
 


可以看到,对应的类被注册了bean定义。

2、@ConditionalOnClass注解

这个注解用于检测类路径里是否包含某个类,其实就是确定是否引入了指定的依赖。

如下图:
 


因为我用的JDK1.8,肯定有这个类,所以会匹配上,结果如下图:
 


:@ConditionalOnMissingClass注解原理一样,只不过是否定性的匹配而已。

3、@ConditionalOnBean注解

这个注解用于检测容器中是否包含指定的bean。如下图:
 


除了可以用Class<?>指定bean外,还可以使用类的全名称,还可以使用bean名称(即beanName)。

还可以使用注解指定是否包含标有该注解的bean。

示例中是通过Class<?>来指定的,而且指定的是之前注册过的bean,所以一定能匹配上。

执行结果如下图:
 


:@ConditionalOnMissingBean注解原理一样,只不过是否定性的匹配而已。

4、@ConditionalOnSingleCandidate注解

这个注解用于检测容器中能够匹配上的候选bean是否只有一个。

只有一个是什么意思呢?就是某个类只注册了一次,这时就是只有一个。比如Boss类。

但是员工可以有多个,所以就会有多个Staff类被注册。此时就不满足条件了。

如果此时还想满足的话,就必须在其中一个Staff类注册时标上@Primary注解。

如下图:
 


因为我们指定的bean只注册了一次,所以一定满足条件。

执行结果如下图:
 


5、@ConditionalOnResource注解

这个注解用于检测类路径中是否包含指定的资源。一般也就是文件了。

我们来检测下配置文件,如下图:
 


肯定是存在的,执行结果如下图:
 




自定义条件注解


需要实现一个条件接口,如下图:
 


只有一个方法,返回true表示匹配上,false则相反。

方法的第一个参数,是一个上下文,如下图:
 


这里有很多的东西供我们使用。

方法的第二个参数,是最终标有我们定义好的条件注解的那个类,这个一定要明白。

我们来定义两个和操作系统对应的注解,一个用于Windows,一个用于Linux。

Windows版本的实现,如下图:
 


从Environment中读出操作系统的名称,看是否包含windows即可。

Linux版本的实现,如下图:
 


原理和刚刚的一样。

再定义两个注解,分别和这两个条件实现类关联起来。

Windows版本的,如下图
 


Linux版本的,如下图:
 


然后开始试用一下这两个条件注解,如下图:
 


因为我用的是Windows,所以肯定只有@Windows注解可以匹配。

执行结果如下图:
 


这只是一个简单的示例,可以根据自己的需要定义更加复杂的,但是原理和流程都是一样的。

                               

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值