@Conditional+@Configuration有没有搞头?
日拱一卒,功不唐捐。
在了解 @Conditional 之前先花 10 秒钟复习一下 @Configuration 这个注解。
@Configuration 是干什么?
是配合 @Bean 注解来配置 Spring 容器的 bean 的。
那它为什么会出现呢?
因为配置 bean 的另一种方式是 xml ,狗都不用。
那给个示例看看呗?
简单。
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// 初始化, 配置, 返回bean...
}
}
下面进入主题:
@Conditional 是什么东西?
首先明确第一点:
@Conditional 是 Spring 提供的。
其次明确第二点:
Conditional 中文译为:有条件的,依...而定的。
前边既然讲了 @Configuration 的简单用法,那么问题就是:
@Configuration + @Conditional 有没有搞头?
有搞头。
怎么搞?
那就是可以给@Configuration加上一个开关。
我打开开关,你这配置就好用。
我关闭开关,你这配置就不好用。
进一步升级。
我给 @Configuration 里的 @Bean 加一个开关。
我打开开关,你这 bean 就注册。
我关闭开关,你这 bean 就不注册。
那开关在哪里呢?
废话不多说,先上代码。
@Configuration
@Conditional(MyCondition.class)
public class ConditionConfig {
@Bean
public ConditionBean conditionBean() {
return new ConditionBean();
}
}
开关就是代码中的 MyCondition.class。
WTF is MyCondition.class ?
MyCondition类就是我们自定义的开关,我们定义什么时候开,什么时候关的逻辑。
很明显这个逻辑不可能是 Spring 给的。
但 Spring 又必须插手管理。
通过什么呢?

没错,通过接口 Condition。
这个接口中什么都没有,只有一个 matches 方法,返回一个 boolean 值。
显而易见,你返回 true, 开关打开,返回 false,开关关闭。
MyCondition 类代码如下:
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}
可以看到 matches 方法中的两个参数,可以简单介绍一下。
ConditionContext context 这个参数提供了一种方法来访问关于Spring容器的信息。
AnnotatedTypeMetadata metadata 这个参数提供了对被注解类的元数据的访问。
基于这两个参数我们就可以创建复杂和动态的条件来控制开关的闭合。
例如,你可以基于环境变量、定义的bean、类的存在等因素,来决定是否创建某个bean。

除了自定义 Condition,Springboot 还为我们扩展了一些常用的 Condition。

@Conditional+@Configuration有没有搞头?的更多相关文章
- Java学习记录-注解
注解 一.org.springframework.web.bind.annotation ControllerAdviceCookieValue : 可以把Request header中关于cooki ...
- spring注解驱动开发
1.全图: 一.IOC容器部分 1.第一个初始化实例: @Configuration @ComponentScans @Bean("person") 注意: @repeatable ...
- spring注解开发-IOC
1. @Configuration, @Bean @Configuration该注解就是用来告诉spring这是配置类 @Bean该注解是用来注册一个bean.类型是返回值的类型,ID默认是用方法名作 ...
- Spring.Boot.1 -- 概览
Spring Boot 是如何简化Java 开发的 SpringBoot的一些重要特征 长久以来,Spring 框架作为Java应用开发的框架地位稳固.最近在云计算.大数据.无结构数据持续化.函数式反 ...
- Java 框架面试题-Spring Boot自定义配置与自动配置共存
Spring Boot 是一个快速开发框架,可以简化 Spring 应用程序的开发,其中自定义配置是其中一个非常重要的特性. 在 Spring Boot 中,自定义配置允许开发者以自己的方式来配置应用 ...
- spring-boot-2.0.3源码篇 - @Configuration、Condition与@Conditional
前言 开心一刻 一名劫匪慌忙中窜上了一辆车的后座,上车后发现主驾和副驾的一男一女疑惑地回头看着他,他立即拔出枪威胁到:“赶快开车,甩掉后面的警车,否则老子一枪崩了你!”,于是副驾上的男人转过脸对那女的 ...
- 14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明
1.@Configuration.@Bean.@Import().@ImportResource().@Conditional 分析源码的时候总会见到标题中的这几个注解,因此:弄一篇博客来说明一下吧, ...
- Conditional project or library reference in Visual Studio
Conditional project or library reference in Visual Studio In case you were wondering why you haven’t ...
- P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1
P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1 May ...
- [读书笔记] 二、条件注解@Conditional,组合注解,元注解
一.条件注解@Conditional,组合注解,元注解 1. @Conditional:满足特定条件创建一个Bean,SpringBoot就是利用这个特性进行自动配置的. 例子: 首先,两个Condi ...
随机推荐
- Linux下jdk配置
1.首先执行以下命令查看可安装的jdk版本: yum -y list java* 执行成功后可看到如下界面: 2.选择自己需要的jdk版本进行安装,比如这里安装1.8,执行以下命令: yum in ...
- 在线问诊 Python、FastAPI、Neo4j — 构建问题分类器
目录 构建字典数据 构建 Trie 字典树 按实体组装字典 问题分析 将问题进行分析,和系统已有的分类进行关联 构建字典数据 将构建的知识图片字典化, 用于后面对问题的解析,下图为症状的字典,其它字典 ...
- Asp-Net-Core开发笔记:快速在已有项目中引入EFCore
前言 很多项目一开始选型的时候没有选择EFCore,不过EFCore确实好用,也许由于种种原因后面还是需要用到,这时候引入EFCore也很方便. 本文以 StarBlog 为例,StarBlog 目前 ...
- 单元测验4:人格知识大比武2mooc
单元测验4:人格知识大比武2 返回 本次得分为:10.00/10.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(2分) 关于M ...
- GeoServer发布影像WMTS服务
WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案. WMTS: 切片地图web服务(OpenGIS Web Map Tile Service) 使用GeoServer发布WMTS服 ...
- Java多线程笔记全过程(一)
一.多线程最基础的基本概念 一个程序最少需要一个进程,而一个进程最少需要一个线程. 我们常说的高并发,也并不全是线程级别的并发,在很多开发语言中,比如PHP,很常见的都是进程级别的并发.但是在Java ...
- Meteors 题解
Meteors 蒟蒻初学整体二分,写一篇题解记录一下思考与看法. 题目大意 在一个环形的轨道上分别着若干国家的空间站,在接下来的一段时间内会出现若干次陨石,每次出现在环形的某一段轨道,每个国家都想收集 ...
- 21.1 Python 使用PEfile分析PE文件
PeFile模块是Python中一个强大的便携式第三方PE格式分析工具,用于解析和处理Windows可执行文件.该模块提供了一系列的API接口,使得用户可以通过Python脚本来读取和分析PE文件的结 ...
- 17.1 隐藏执行CMD命令
本章内容涉及使用Socket API和CMD命令行工具实现本地CMD命令执行.无管道正向CMD和无管道反向CMD三种功能.执行本地CMD实现使用CreateProcess函数创建一个新的CMD进程,并 ...
- PKUSC & GDCPC 2023 游记
离得太近,游记打算扔一起. 有没有神仙面基啊 /kel. PKUSC 2023 Day -? 突然听说不给 NOI Linux,震惊. 前情提要:在从 CSP 开始就全员强制 linux 的 LN 为 ...