SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解
作者:tytler 发布时间:2023-04-04 03:37:18
标签:SpringBoot,@ConditionalOnXXX,注解
实现一个自定义的 @Conditional 派生注解
自定义一个注解,继承 @Conditional 注解
// 派生注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(CustomConditional.class)
public @interface ConditionalOnCustom {
String[] value() default {};
}
注解的处理类
public class CustomConditional implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 获取到自定义注解中的 value 值
String[] properties = (String[]) metadata.getAnnotationAttributes("smoketest.test.condition.ConditionalOnCustom").get("value");
// 遍历自定义属性的 value 值
for (String property : properties) {
// 获取定义在配置文件中的值,并且 equals("customBean") 则返回 true
if ("customBean".equals(context.getEnvironment().getProperty(property))) {
return true;
}
}
return false;
}
}
使用注解
@Component
@ConditionalOnCustom({"smoketest.test.condition.bean"})
public class ConditionalUse {
}
application.properties 中配置变量
smoketest.test.condition.bean = customBean
获取 ConditionalUse 对象
@SpringBootApplication
@ConfigurationPropertiesScan
public class SampleTestApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SampleTestApplication.class, args);
ConditionalUse bean = context.getBean(ConditionalUse.class);
System.out.println(bean);
}
}
程序启动可以看到成功获取 ConditionalUse 对象
Conditional 派生注解的类如何注入到 spring 容器
@Conditional 注解在 spring 的 ConfigurationClassParse 类中会调用 ConditionEvaluator.shouldSkip() 方法进行判断,Condition 接口的 matches() 是否返回 true,如果返回 true,就实例化对象,并注册到 spring 容器中
shouldSkip() 这个方法执行的逻辑主要是如果是解析阶段则跳过,如果是注册阶段则不跳过
如果是在注册阶段即 REGISTER_BEAN 阶段的话,此时会得到所有的 Condition 接口的具体实现类并实例化这些实现类,然后再执行下面关键的代码进行判断是否需要跳过
if ((requiredPhase == null || requiredPhase == phase) && !condition.matches(this.context, metadata)) { return true; }
上面代码最重要的逻辑是调用 Condition 接口的具体实现类的 matches() 方法,若 matches() 返回 false,则跳过,不进行注册 bean 的操作
若 matches() 返回 true,则不跳过,进行注册 bean 的操作
来源:https://blog.csdn.net/qq_41956014/article/details/126562752
0
投稿
猜你喜欢
- 本文实例讲述了Android编程实现WebView添加进度条的方法。分享给大家供大家参考,具体如下:标准的XML界面<?xml ver
- 一、安装MongoDB4.0.3(××)1.1、官方安装文档https://docs.mongodb.com/manual/tutorial
- 这篇文章主要介绍了Spring整合MyBatis图示过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- Handler是什么?Handler 是一个可以实现多线程间切换的类,通过 Handler 可以轻松地将一个任务切换到 Handler 所在
- 前言上文讲的MyBatis部署运行且根据官网运行了一个demo:一步到位部署运行MyBatis3源码<保姆级>jdbc再贴一个J
- Idea2020.2创建JavaWeb的方式略有改动,以下做个记录,大家可以参考下,对以后的工作有所帮助!1.创建项目不再是Java Ent
- 1|0构造socket在【客户端/服务端】的通信模式中,客户端需要主动构造与服务器连接的 Socket,构造方法有以下几种重载形式:Sock
- 声明式事务很方便,尤其纯注解模式,仅仅几个注解就能控制事务了思考:这些注解都做了什么?好神奇!@EnableTransactionManag
- 第一步:引入jar包 <dependency> <gro
- 相信在做B/S模式的项目时,我们请求server端时通常遇到返回数据的处理,对返回数据的格式处理方式多样,随着JSON的流行,现在很多的项目
- 在《Spring Boot Hello World》中介绍了一个简单的spring boot例子,体验了spring boot中的诸多特性,
- 多选和单选的不同之处单选的时候,选中一个就可以直接把结果返回,因此本身底部弹窗无需状态管理。但到多选的时候,需要知道当前选中的选项,有选项被
- 此解决方案是针对window的,因为日志默认保存路径在C盘,linux忽略。学习RocketMQ过程中,总是出现com.alibaba.ro
- 起源flutter作为一个跨平台的框架,在绘制上体现出了它跨平台的良好性能.那么,它是如何从runApp()后 绘制上屏的呢?本文将与你一起
- 接着上次的实现, 添加 mybatis 查询 orcale 数据库第一步: 新建几个必须的包, 结果如下第二步: 在service包下新建p
- 一、前言(吐槽+煽情+简介) &n
- log4j2支持日志的异步打印,日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影
- 本文为大家分享了java摄像头截图的具体代码,供大家参考,具体内容如下本来sun有个jmf组件可以很方便的实现摄像头截图的,不过这版本后来停
- 定义:/** * @author Administrator * @project: TestOne * @package: PACKAGE
- MyBatis 通过包含的jdbcType类型BIT FLOAT CHAR &nbs