玩转SpringBoot用好条件相关注解,开启自...
因为Spring的核心是基于bean的,所以这些条件注解主要是影响bean的注册。
因为注册的bean不同了,最后对外呈现的行为就不同了。不就是自动配置了。
一、最常用的应该是@Profile注解了
根据不同的环境可以注册不同的bean,如下图01:


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


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

二、@ConditionalOnProperty注解
这个注解用于检测Environment中的指定属性是否存在或等于某个指定的值。
如下图06:

matchIfMissing属性就是说,如果没有发现这个属性,算不算匹配上,设置为true就算,false就不算,默认为不算。
请看配置文件,如下图07:


三、@ConditionalOnClass注解
这个注解用于检测类路径里是否包含某个类,其实就是确定是否引入了指定的依赖。
如下图09:


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

还可以使用注解指定是否包含标有该注解的bean。
示例中是通过Class<?>来指定的,而且指定的是之前注册过的bean,所以一定能匹配上。
执行结果如下图12:

五、@ConditionalOnSingleCandidate注解
这个注解用于检测容器中能够匹配上的候选bean是否只有一个。
只有一个是什么意思呢?就是某个类只注册了一次,这时就是只有一个。比如Boss类。
但是员工可以有多个,所以就会有多个Staff类被注册。此时就不满足条件了。
如果此时还想满足的话,就必须在其中一个Staff类注册时标上@Primary注解。
如下图13:

执行结果如下图14:

这个注解用于检测类路径中是否包含指定的资源。一般也就是文件了。
我们来检测下配置文件,如下图15:


自定义条件注解
需要实现一个条件接口,如下图17:

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

方法的第二个参数,是最终标有我们定义好的条件注解的那个类,这个一定要明白。
我们来定义两个和操作系统对应的注解,一个用于Windows,一个用于Linux。
Windows版本的实现,如下图19:

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

再定义两个注解,分别和这两个条件实现类关联起来。
Windows版本的,如下图21



执行结果如下图24:

玩转SpringBoot用好条件相关注解,开启自...的更多相关文章
- 【玩转SpringBoot】用好条件相关注解,开启自动配置之门
自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...
- 【玩转SpringBoot】给自动配置来个整体大揭秘
上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...
- 【玩转SpringBoot】看似复杂的Environment其实很简单
喜欢写代码,讨厌配环境 我相信这十个字的小标题代表了大多数码农的心声. 十年前读大学时,学校开设了C语言还有C++.但是学习这两种语言,对于新手来说非常没有成就感. 于是我就在校门口买个光盘,装个VS ...
- 【玩转SpringBoot】翻身做主人,一统web服务器
寄人篱下的日子 一直以来受传统影响,我们的web工程总是打成war包,然后放入tomcat的webapps目录下面. 如下图01: 当tomcat启动时,会去解压war包,然后运行web工程.这大家都 ...
- 【玩转SpringBoot】让错误处理重新由web服务器接管
其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们 ...
- 【玩转SpringBoot】通过事件机制参与SpringBoot应用的启动过程
生命周期和事件监听 一个应用的启动过程和关闭过程是归属到“生命周期”这个概念的范畴. 典型的设计是在启动和关闭过程中会触发一系列的“事件”,我们只要监听这些事件,就能参与到这个过程中来. 要想监听事件 ...
- 【玩转SpringBoot】异步任务执行与其线程池配置
同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量. 此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦. 不过在遇到SpringBoot异步任务时,这个问题就不 ...
- 【玩转SpringBoot】SpringBoot应用的启动过程一览表
SpringBoot应用的启动方式很简单,就一行代码,如下图01: 其实这行代码背后主要执行两个方法,一个是构造方法,一个是run方法. 构造方法主要内容就是收集一些数据,和确认一些信息.如下图02: ...
- Springboot 相关注解大全
1.Spring注解 1.@Autowired 标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值:方法使用的参数,自定义类型的值从ioc容器中获取自动装配; Spring利用依赖注入( ...
随机推荐
- Mysql 3306 被 linux 防火墙拦截
项目测试时需要本地连接linux服务器的mysql, 发现navicat无法连接 原因一:mysql没有添加外部ip的访问权限. 原因二:mysql 的 3306 端口 处于被防火墙的拦截状态. 解决 ...
- 2019年Unity3D游戏开发前景预测及总结
由于现在随着互联网时代的到来,人们上网玩游戏的越来越多,导致游戏开发人才供不应求,如果你想成为一名优秀的开发者,那么掌握Unity3D开发技术是不可跳过的一环.随着移动互联网的发展,移动端游戏日益盛行 ...
- 代码杂谈-SQL中的rank&row_number函数
两个函数细节记不住. 写个例子备注一下. select no, name, score , rank() over(partition by no order by score asc) rk1 , ...
- SQL基础教程(第2版)第3章 聚合与排序:练习题
存在以下 个错误. .使用了字符类型的列(product_name)作为 SUM 函数的参数. >> 解答 SUM 函数只能使用数值类型的列作为参数. . WHERE 子句写在了 GROU ...
- UML-领域模型的精化
拙劣的分类和错误的概括是混乱生活的祸根.--H.G.Wells的总结 1.is-a原则 子类定义的成员变量.方法与超类必须一致.即:不能多,也不能少. 子类是“一种”超类.CreditPayment是 ...
- MySQL--索引和外键
来自:http://www.jb51.net/article/32149.htm 1.添加PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY ...
- h5-FileReader对象的使用
<!--FileReader对象的使用--> <!--需要及时预览 及时:当用户选择完图片之后就立即进行预览处理--onchange事件 预览:通过文件读取对象的readAsData ...
- idtcp实现文件下载和上传
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- vzray上网教程
1.首先按照之前的教程在chrome里安装插件-Proxy-SwitchyOmega-Chromium-2.5.15 2.打开 vzray-v3.11-windows-64,打开 3.在chrome ...
- 对于centos的运用ssh远程连接
1,首先安装ssh服务器 $yum install openssh-server 2,记录你当前centos的ip地址 $ifconfig 3,再在windows里面安装putty 4安装完成后, 在 ...