Spring Boot conditional注解用法详解
作者:work hard work smart 发布时间:2022-03-19 02:32:25
1、conditional注解介绍
含义: 基于条件的注解
作用: 根据是否满足某一个特定条件来决定是否创建某个特定的bean
意义: Springboot实现自动配置的关键基础能力
2、常见conditional注解
@ConditionalOnBean 框架中存在某个Bean时生效
@ConditionalOnMissingBean 在Bean不存在时生效
@ConditionalOnClass框架中存在某个Class时生效
@ConditionalOnMissingClass在Class不存在时生效
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnProperty 当前框架中是否包含特定的属性
@ConditionalOnJava 当前是否存在某个Java版本
3、Conditional的使用
1) 创建A.java,增加注解ConditionalOnProperty,表示系统中有这个属性才实例化A
@Component
@ConditionalOnProperty("com.example.condition")
public class A {
}
2) 创建测试类
@RunWith(SpringRunner.class)
@SpringBootTest
@Import(MyBeanImport.class)
public class ConditionTest implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Test
public void testA() {
System.out.println(applicationContext.getBean(A.class));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
3、运行测试类
抛出异常,表示没有找到A这个类。
然后在application.properties文件中增加属性
再次运行测试。成功。
4、A类中有个注解ConditionOnProperty
1) 进入注解ConditionOnProperty。里面有一个@Conditional注解
2) 进入@Conditional注解。里面的value是Class类型,并且继承自Condition接口
3) 进入Condition接口。里面只有一个方法。当这个方法返回true时,这个bean才会注入到容器当中。
5、自定义Conditional 注解
1) 创建MyCondition类。实现Condition接口重写matches方法,符合条件返回true
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String[] properties = (String[]) metadata
.getAnnotationAttributes("com.example.demo.condi.MyConditionAnnotation")
.get("value");
for(String property : properties){
if(StringUtils.isEmpty(context.getEnvironment().getProperty(property))){
return false;
}
}
return true;
}
}
2) 创建注解MyConditionAnnotation ,并且引入Conditional注解,引入MyCondition类
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({MyCondition.class})
public @interface MyConditionAnnotation {
String[] value() default {};
}
3) 创建类AA使用注解MyConditionAnnotation
@Component
@MyConditionAnnotation({"com.example.condition1","com.example.condition2"})
public class AA {
}
4) 测试
a) 此时并没有com.example.condition1和com.example.condition2这两个属性值,所有测试失败
b) 然后增加这两个属性。
测试成功
来源:https://www.cnblogs.com/linlf03/p/12438854.html


猜你喜欢
- java应用CPU有波动,事后怎么分析?目前我采用的方案是根据CPU负载自动执行jstack,并将文件上传到OSS。 环境:阿里云
- Java8对List<Integer>的求和想要用流对List<Integer>进行求和,但查找完资料都是对List
- 微信是现在比较流行的应用了,在各大安卓市场几乎都是名列前茅了。说实话不得不羡慕腾讯庞大的用户群体,只要腾讯敢做,就会有很多人去用。废话不多说
- 我们都知道mybatis在进行参数判断的时候,直接可以用<if test=""></if> 就可
- 开发工具:VS2017语言:C#DotNet版本:.Net FrameWork 4.0及以上使用的DLL工具名称:GemBox.Spread
- 本文实例为大家分享了Android自定义控件实现简单滑动开关的具体代码,供大家参考,具体内容如下ToggleButton 滑动开关项目概述滑
- 问题分析疑惑满满小枫听到这个面试题的时候,心想这是什么水面试官,怎么问这么简单的题目,心想一个for循环加上equal判断再删除不就完事了吗
- 一、Thread 的常见构造方法方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对
- 前言在Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决。对话框
- 详解Android Studio正式签名进行调试的实现步骤在Android Studio中,可以使用Gradle进行打包时自动签名。其实An
- 本文实例为大家分享了android实现动态显示隐藏进度条的具体代码,供大家参考,具体内容如下调用ProgressUtil.startProg
- 最近,在使用spring cloud框架时,发现feign也能实现三方请求,而且实现很简单,请求接口的结构很清晰,便果断学习一波。记录一下。
- 前言Stream是一个来自数据源的元素队列并支持聚合操作,其中具有以下特性:Stream只负责计算,不存储任何元素,元素是特定类型的对象,形
- 当一个产品或者项目由大量独立模块组成时,想要从 Git 挨个下载下来导入 IDE 查看并不容易,此时可以结合使用 Git 和 Maven 的
- C#中的表格控件只有一个,那就是datagridview,不像QT中可以用QTableview,QTableWidget。新手拿到datag
- 本篇文章是SpringBoot最入门的介绍。我们不借助任何额外的工具,从无到有创建一个Spring Boot的web项目,并运行这个项目。项
- 完整代码:https://github.com/iyuanyb/Downloader多线程下载及断点续传的实现是使用 HTTP/1.1 引入
- 在进行一个表达式的计算时,先将表达式分割成数字和字符串然后利用出入栈将分割后的表达式进行中缀转后缀,再将后缀表达式进行计算得到结果(思想在上
- 本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容。封装封装一个Teacher和Student类package com.hz.tes
- instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。 举个例子:public