官方提供的常用条件注解

因为Spring的核心是基于bean的,所以这些条件注解主要是影响bean的注册。

因为注册的bean不同了,最后对外呈现的行为就不同了。不就是自动配置了。

一、最常用的应该是@Profile注解了

根据不同的环境可以注册不同的bean,如下图01:

首先,不激活任何环境,执行一下,结果如下图02:

 

可以看到,没有激活任何环境,所以默认是default。因此Default类就被注册了。

然后,激活一下prod环境,在IDE里设置一下,如下图03:

 

再次运行一下,结果如下图04:

 

可以看到,prod环境被激活了,所以Prod类就被注册了。

SpringBoot内置了一些注解,如下图05:

 

我们关注一些常用的就可以了。

二、@ConditionalOnProperty注解

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

如下图06:

 

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

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

请看配置文件,如下图07:

 

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

 

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

三、@ConditionalOnClass注解

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

如下图09:

 

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

 

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

四、@ConditionalOnBean注解

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

 

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

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

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

执行结果如下图12:

 

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

五、@ConditionalOnSingleCandidate注解

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

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

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

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

如下图13:

 

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

执行结果如下图14:

 

六、@ConditionalOnResource注解

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

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

 

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

 

自定义条件注解

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

 

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

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

 

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

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

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

Windows版本的实现,如下图19:

 

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

Linux版本的实现,如下图20:

 

原理和刚刚的一样。

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

Windows版本的,如下图21

 

Linux版本的,如下图22:

 

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

 

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

执行结果如下图24:

 

这只是一个简单的示例,可以根据自己的需要定义更加复杂的,但是原理和流程都是一样的。
以上文章来源于网络
更多java学习资料可关注:itheimaGZ获取

最新文章

  1. JavaScript-在当前显示区范围内实现点不到的小方块
  2. bochs上网及配置
  3. python入门学习课程推荐
  4. Centos6.4安装erlang并配置mysql数据库
  5. ios企业应用发布流程
  6. 【摘要】多线程 - BeginInvoke异步调用
  7. TinyHttpd中sockaddr与struct sockaddr_in的区别
  8. 实施费用也能DIY--走出软件作坊:三五个人十来条枪 如何成为开发正规军(九)[转]
  9. arcgis for android访问arcgis server上自己制作部署的地图服务
  10. 转:FIFO和DMA
  11. 10-利用com组件读取office
  12. Bootstrap风格登录界面设计样例
  13. python 中如何导入一个自己创建的模块
  14. Android中JNI编程详解
  15. springboot~Money类型在序列化时遇到的问题与解决
  16. mysql 删除重复数据
  17. python 发送163邮件
  18. TNS-12560,TNS-00583: Valid node checking: unable to parse configuration parameters
  19. http post 请求详解
  20. odoo学习之带出信息

热门文章

  1. php封装一个接口类
  2. ssh 账号密码登录设置
  3. CodeForces 1292A NEKO&#39;s Maze Game(思维)
  4. 吴裕雄--天生自然Linux操作系统:Linux 远程登录
  5. 吴裕雄--天生自然Linux操作系统:Linux 忘记密码解决方法
  6. 第7节 Arrays工具类
  7. dfs+剪枝 poj1011
  8. HTML引入文件/虚拟目录/绝对路径与相对路径
  9. Vue专题-生命周期
  10. gcc -c xx.c 选项讲解