SpringBoot之conditional注解
@Conditional介绍
首先我们先了解一下@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,需要注入的Bean满足给定条件才可以注入到Spring IOC容器中。
- 作用:根据是否满足某一个特定条件来决定是否创建某个特定的Bean
- 意义:Springboot实现自动配置的关键基础能力
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {/*** All {@link Condition Conditions} that must {@linkplain Condition#matches match}* in order for the component to be registered.*/Class<? extends Condition>[] value();}
从注解的定义我们可以看到,使用该注解我们需要传入的是一个Class数组,并且这些Class必须实现Condition接口,Condition接口定义如下:
@FunctionalInterface
public interface Condition {/*** Determine if the condition matches.* @param context the condition context* @param metadata metadata of the {@link org.springframework.core.type.AnnotationMetadata class}* or {@link org.springframework.core.type.MethodMetadata method} being checked* @return {@code true} if the condition matches and the component can be registered,* or {@code false} to veto the annotated component's registration*/boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}
实现Condition接口必须实现matches方法,matches方法由子类实现(判断条件是否匹配)返回true,代表@Conditional注解的Bean可以被注入到Spring IOC容器,返回false,@Conditional注解的Bean就不会被注入到Spring IOC容器。
spirngboot中常用的@Conditional注解
- @ConditionalOnBean(存在某个bean的时候实例化)
- @ConditionalOnMissingBean(不存在某个bean的时候实例化)
- @ConditionalOnClass(存在某个类时,才会实例化一个Bean)
- @ConditionalOnSingleCandidate(指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean)
- @ConditionalOnMissingClass(不存在某个类时,才会实例化一个Bean)
- @ConditionalOnWebApplication(如果是Web应用)
- @ConditionalOnProperty(控制配置类是否生效)
- @ConditionalOnNotWebApplication(如果不是Web应用)
- @ConditionalOnJava(如果是Java应用)
- @ConditionalOnResource(对指定资源进行校验)
我们来看看@ConditionalOnBean注解
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnBean {...
}
@Conditional(OnBeanCondition.class)
,那么OnBeanCondition这个类应该实现了Condition
具体逻辑不细究,我们可以自己实现一个这样的注解。
自定义
实现步骤
- 编写注解类,类上标注@Conditional的实现
import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface MyConditionAnnotation {String[] value() default {};}
- Conditional的实现类
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.StringUtils;public class MyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {/*** 获取注解值*/String[] properties = (String[])metadata.getAnnotationAttributes("com.bushro.condi.MyConditionAnnotation").get("value");for (String property : properties) {//环境变量中有这些变量则匹配成功if (StringUtils.isEmpty(context.getEnvironment().getProperty(property))) {return false;}}return true;}
}
- 配置使用
@Component
@ConfigurationProperties(prefix = "bushro")
@MyConditionAnnotation({"test1", "test2"})
public class MyConfig {private String condition;public String getCondition() {return condition;}public void setCondition(String condition) {this.condition = condition;}
}
application.properties配置
bushro.condition=test
test1=xxx
test2=xxx
- 测试看能不能获取到MyConfig这个bean,然后去掉test1的配置再试试
@Testpublic void testA() {MyConfig bean = applicationContext.getBean(MyConfig.class);System.out.println(bean.getCondition());}
SpringBoot之conditional注解相关推荐
- @data注解_聊一下@Conditional注解系列的作用
欢迎大家关注我的微信公众号,码猿Bug,或者扫描下方二维码,有需要资料的可以随时联系我 http://weixin.qq.com/r/qig7I1LEOw9ErRZA9324 (二维码自动识别) 今天 ...
- SpringBoot conditional注解和自定义conditional注解使用
conditional注解是Springboot starter的基石,自动装配的时候会根据条件确定是否需要注入这个类. 含义:基于条件的注解. 作用:根据是否满足某个特定条件来决定是否创建某个特定的 ...
- springboot中的@Conditional注解
springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注 ...
- 一篇文章教你读懂Spring @Conditional注解
文章目录 一.Conditional简介 二.Conditional用法 1.Conditonal注解作用在方法上 2.Conditonal注解作用在类上 3.类上注入多个条件类 三.Conditio ...
- SpringBoot的@Conditional和自动配置类生效
@Conditional原理 在之前的博客中提到了关于自动配置的原理,但是在自动配置的时候有很多的判断,只有当这些判断都成功之后在自动配置的时候才会成功.但是我们会发现一个问题,当我们使用@Be ...
- 12、常见Conditional注解源码解析(ok)
参考资料:彻底搞定 Java 注解 Spring Boot中所有的@Conditional 注解如下: Conditional (o.s.context.annotation)|-Conditiona ...
- SpringBoot--自动装配原理详解及应用之Conditional注解
SpringBoot作为当今开发的主流框架,作为一名java开发是不可能的不了解的,这个东西是典型的用起来很简单,但是了解到原理之后就会不自觉地感叹,真TMNB! 本文主要讲解其自动装配的原理,以及我 ...
- Spring @Conditional注解 详细讲解及示例
前言: @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. @Conditional的定义: //此注解可以标注在类和方法上 @Tar ...
- 【Spring注解】@Conditional注解的使用
前言 @Conditional注解的判断条件,决定了该类是否可以成为Bean.即使该类被@Component注解修饰,@Conditional条件是false,那么该类也不会注入到IOC容器中.且该注 ...
最新文章
- EBS R12中如何使用CGI登录Form
- Generator-ing Values
- 居民信息管理系统java_基于jsp的社区住户信息管理系统-JavaEE实现社区住户信息管理系统 - java项目源码...
- localtime与localtime_r
- Autofac的AOP面向切面编程研究
- 11 个简练的 Java 性能调优技巧
- 关于ANTLR的通用库的需求:使用反射来构建元模型
- torchtext处理文本数据——构造dataset读取文本(学习一)
- 使用LazZiya.ExpressLocalization开发多区域性ASP.NET Core 3、2、1项目
- Bailian4134 查找最接近的元素【二分查找】
- Linux课程第二十四天学习笔记
- AspNet2.0的QuickStart出了
- 《SVN web管理工具CollabNetSubversionEdge》
- 什么情况下使用10分钟邮箱?8个临时邮箱推荐
- EXCEL 统计每日订单量(拉勾教育数据分析实战训练营学习笔记)
- oracle创建存储过程报错,oracle创建了存储过程,在PLSQL @路径 执行后报错
- window计算机桌面的组成,Windows 10桌面的组成,Win10桌面介绍
- 开源项目zheng运行环境
- 【错误解决】System.NotSupportedException:“LINQ to Entities does not recognize the method
- Python代码篇-单例模式(五种实现单利方式)