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
猜你喜欢
- 前言关于ThreadLocal (线程本地存储),从字面意思上看主要是存储一些本地变量,使它们能在一个线程内共用,与其他的线程进行数据隔离,
- 删除字符串的所有标点str = str.replaceAll("[\\pP‘'“”]", ""
- 一、准备官网下载IntelliJ IDEA 2017 并安装好下载汉化包 (链接: https://pan.baidu.com/s/1JkU
- 现在有一张订单表t_stockorder,其拥有id、code、client_id、merchandise_id、merchandise_n
- 功能介绍大家都知道在Spring boot开发过程中,需要在配置文件里配置许多信息,如数据库的连接信息等,如果不加密,传明文,数据库就直接暴
- 本文实例为大家分享了java实现人员信息管理系统的具体代码,供大家参考,具体内容如下实现增删改查.java入门的练手小程序1.Person类
- eclipse运行tomcat提示端口被占用今天碰到一个问题,在eclipse中运行一个程序,eclipse里面的tomcat一启动就报错说
- 下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试。1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程
- 纯Java代码模拟Hibernate一级缓存原理,简单易懂。import java.util.ArrayList;import java.u
- 项目地址:gitee.com/baojh123/rp…netty-study 这个项目是没用到的,可以删掉,主要是测试
- 本文通过解决老王经常搞错借书人的问题,来引出行为型模式中的命令模式。为了在案例之上理解的更加透彻,我们需要了解命令模式在源码中的应用。最后指
- 本文实例讲述了Android TextView跑马灯效果实现方法。分享给大家供大家参考,具体如下:public class MyTextVi
- 分类1.简单工厂模式2.工厂方法模式3.抽象工厂模式案例需求根据蛋糕的不同口味,分别创建苹果味和香蕉味的蛋糕实例方案一:简单工厂模式定义蛋糕
- 前言之前采取项目中嵌套html页面,实现基本的登录校验、权限校验、登出操作、记住我等功能试下。但是,现在的开发基本都是前后分离样式,后端并不
- 最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求的
- 背景Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,
- SpringBoot集成Mybatis时mybatis.mapper-locations和@MapperScan的作用1、mybatis.m
- synchronized 和 Reentrantlock多线程编程中,当代码需要同步时我们会用到锁。Java为我们提供了内置锁(synchr
- /** * 三角数字: * 比达哥斯拉领导下的古希腊数学家发现了一个有趣的数字序列1, 3, 6, 10, 15, 21,... *
- android线程消息机制主要由Handler,Looper,Message和MessageQuene四个部分组成。平常在开发中,我们常用来