玩转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利用依赖注入( ...
随机推荐
- 沙龙报名 | 京东云DevOps——自动化运维技术实践
随着互联网技术的发展,越来越多企业开始认识DevOps重要性,在企业内部推进实施DevOps,期望获得更好的软件质量,缩短软件开发生命周期,提高服务稳定性.但在DevOps 的实施与落地的过程中,或多 ...
- Springboot整合mongodb时无法连接数据库
由于之前没有接触过mongodb,最近在学习时遇到了一些问题.用yml配置mongodb如下: spring: application: name:xc-service-manage-cms data ...
- Windows环境下spyder调用Arcpy
用python写代码还是喜欢spyder,所以在网上找了通过spyder调用arcpy的方法. 这篇帖子总结的方法非常详细,且通过本人实践,切实可行https://blog.csdn.net/qq_2 ...
- 剑指offer【08】- 二叉树的深度(java)
题目:二叉树的深度 考点:知识迁移能力 题目描述:输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 牛客网上的剑指offer题, ...
- 怎样在 Akka Persistence 中实现分页查询
在 Akka Persistence 中,数据都缓存在服务内存(状态),后端存储的都是一些持久化的事件日志,没法使用类似 SQL 一样的 DSL 来进行分页查询.利用 Akka Streams 和 A ...
- 三、VIP课程:并发编程专题->01-并发编程之Executor线程池详解
01-并发编程之Executor线程池详解 线程:什么是线程&多线程 线程:线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系 ...
- ZJNU 1528 - War--高级
类似于1213取水 可以把空投当作第0个城市 最后将0~n的所有城市跑最小生成树 /* Written By StelaYuri */ #include<iostream> #includ ...
- Ubuntu源码编译安装tensorflow
ubuntu14 cuda9.0_384.81 驱动版本384.90 cudnn7.2 tensorflow1.8 https://blog.csdn.net/pkokocl/article/det ...
- 关系数据库和NOSQL比较
关系数据库 NOSQL 功能: NOSQL 功能简单 基本只支持主键查询,有的NOSQL支持非主键查询(不过非主键查询时,其性能也很慢),很少有N ...
- myeclipse跟tomcat的同步
一般来说,我们在myeclipse里把文件内容改了并保存之后,直接刷新网页就可以非常直观的看到内容的改变. 这是因为myeclipse检测到文件内容的变动,及时地把新的文件部署到了tomcat上. m ...