官方提供的常用条件注解

因为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获取

玩转SpringBoot用好条件相关注解,开启自...的更多相关文章

  1. 【玩转SpringBoot】用好条件相关注解,开启自动配置之门

    自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...

  2. 【玩转SpringBoot】给自动配置来个整体大揭秘

    上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...

  3. 【玩转SpringBoot】看似复杂的Environment其实很简单

    喜欢写代码,讨厌配环境 我相信这十个字的小标题代表了大多数码农的心声. 十年前读大学时,学校开设了C语言还有C++.但是学习这两种语言,对于新手来说非常没有成就感. 于是我就在校门口买个光盘,装个VS ...

  4. 【玩转SpringBoot】翻身做主人,一统web服务器

    寄人篱下的日子 一直以来受传统影响,我们的web工程总是打成war包,然后放入tomcat的webapps目录下面. 如下图01: 当tomcat启动时,会去解压war包,然后运行web工程.这大家都 ...

  5. 【玩转SpringBoot】让错误处理重新由web服务器接管

    其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们 ...

  6. 【玩转SpringBoot】通过事件机制参与SpringBoot应用的启动过程

    生命周期和事件监听 一个应用的启动过程和关闭过程是归属到“生命周期”这个概念的范畴. 典型的设计是在启动和关闭过程中会触发一系列的“事件”,我们只要监听这些事件,就能参与到这个过程中来. 要想监听事件 ...

  7. 【玩转SpringBoot】异步任务执行与其线程池配置

    同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量. 此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦. 不过在遇到SpringBoot异步任务时,这个问题就不 ...

  8. 【玩转SpringBoot】SpringBoot应用的启动过程一览表

    SpringBoot应用的启动方式很简单,就一行代码,如下图01: 其实这行代码背后主要执行两个方法,一个是构造方法,一个是run方法. 构造方法主要内容就是收集一些数据,和确认一些信息.如下图02: ...

  9. Springboot 相关注解大全

    1.Spring注解 1.@Autowired 标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值:方法使用的参数,自定义类型的值从ioc容器中获取自动装配; Spring利用依赖注入( ...

随机推荐

  1. iOS精美过度动画、视频会议、朋友圈、联系人检索、自定义聊天界面等源码

    iOS精选源码 iOS 精美过度动画源码 iOS简易聊天页面以及容联云IM自定义聊天页面的实现思路 自定义cell的列表视图实现:置顶.拖拽.多选.删除 SSSearcher仿微信搜索联系人,高亮搜索 ...

  2. 操作实践:maven工程查找工程中多余的jar包

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 版本迭代过程中对jar的依赖可能会产生变化,一些本不必再依赖的jar包可以因为没有清除而依然留在版本的发布 ...

  3. 《打造扛得住的MySQL数据库架构》第4章 MySQL数据库结构优化

    4-1 数据库结构优化介绍 良好的数据库逻辑设计和物理设计是数据库获得高性能的基础. 1.减少不必要的数据冗余. 2.尽量避免数据维护中出现更新,插入和删除异常. 插入异常:如果表中的某个实体随着另一 ...

  4. DDL&DML

    SQL语言的DDL和DML DDL:数据定义语言它是用来定义 管理数据对象(数据库和数据表)的. create(创建),alter(修改),drop(删除) 一.创建数据库create datebas ...

  5. 提高js性能的方法

    1.文档瘦身 (1)删除注释(版权及法律声明部分应保留),运行时不需要注释. (2)删除制表符.空格和换行符,这些只是为了便于程序的维护,但是与执行无关. (3)替换长的变量名为短的变量名. (4)使 ...

  6. [C/C++]C/C++计算代码的运行时间

    有很多时候,实现一个功能后可能不仅仅要效果,还要效率,如果可以在极短的时间内完成一个功能那当然是最好不过的啦,但是可能经常会事与愿违. 这里就写一下,都可以怎样用C/C++或者Qt的方法来测试代码的运 ...

  7. goahead调试经验

    一.参考网址 1.源码的github地址 2.Web开发之Goahead 二.技术细节 1.默认网页的存放目录和名称 1)目录:在main.c文件中有*rootWeb定义,如:  2)网页名:在mai ...

  8. 吴裕雄--天生自然ShellX学习笔记:Shell printf 命令

    printf 命令模仿 C 程序库(library)里的 printf() 程序. printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好. printf ...

  9. 微服务项目开发学成在线_Vue.js与Webpack

    Vue.js 1.Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.自底向上逐层应用:作为渐进式框架要实现的目标就是方便项目增量开发. 渐进式框架:Progress ...

  10. java复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。

    注意:使用时copy()方法只会复制相同的属性.常用的copy()方法.以下为封装的工具和使用方式. 1.封装类 import java.util.Map; import java.util.Weak ...