在spring某些场景下,我们希望随着某些配置项/类的存在与否,决定一些bean是否被实例化并加载到spring容器。

@Conditional系列注解,便是这个问题的解决方案。

文章目录

  • 相关注解罗列
    • 1. @Conditional注解 (`spring context包下注解`)
    • 2. @ConditionalOnProperty注解 (`spring boot包下注解`)
    • 3. @ConditionalOnClass (`spring boot包下注解`)
    • 4. @ConditionalOnBean (`spring boot包下注解`)
    • 5. @ConditionalOnMissingClass (`spring boot包下注解`)
    • 6. @ConditionalOnMissingBean (`spring boot包下注解`)
    • 7. @ConditionalOnCloudPlatform (`spring boot包下注解`)
    • 8. @ConditionalOnExpression (`spring boot包下注解`)
    • 9. @ConditionalOnJava (`spring boot包下注解`)
    • 10. @ConditionalOnNotWebApplication (`spring boot包下注解`)
    • 11. @ConditionalOnWebApplication (`spring boot包下注解`)
    • 12. @ConditionalOnWarDeployment (`spring boot包下注解`)
    • 13. @ConditionalOnWarDeployment (`spring boot包下注解`)
    • 14. @ConditionalOnResource (`spring boot包下注解`)
    • 15. @ConditionalOnSingleCandidate (`spring boot包下注解`)

相关注解罗列

1. @Conditional注解 (spring context包下注解

需要给定一个value参数,value必须继承Condition接口,实现match方法。
举例:声明一个名为datasource的bean,我们希望只有在存在配置项 lele.datasource.enabled并且为true时才加载该bean。

@Configuration
public class BeanConfig {@Conditional({DataSourceCondition.class})@Bean(name = "datasource")public DataSource(){return DataSource build =  DataSourceBuilder.create().driverClassName("test").url("test").username("test").password("test").build();}}
public class DataSourceCondition implements Condition {@Overridepublic boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {//获取ioc使用的beanFactoryConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();ClassLoader classLoader = conditionContext.getClassLoader();Environment environment = conditionContext.getEnvironment();BeanDefinitionRegistry registry = conditionContext.getRegistry();String property = environment.getProperty("lele.datasource.enabled");if (property.equals(true)){return true;}return false;}
}
2. @ConditionalOnProperty注解 (spring boot包下注解

@ConditionalOnProperty 是springboot基于上述@Conditional注解实现的,他的功能单一但是使用上更加简单。
当存在指定配置项为指定value时,该bean才会被加载。
在 1 中的需求,这里只需要一行注解便可以实现。

@ConditionalOnProperty(name = "lele.datasource.enabled", havingValue = "true")
@Bean(name = "datasource")public DataSource(){return DataSource build =  DataSourceBuilder.create().driverClassName("test").url("test").username("test").password("test").build();}

注解主要参数解释

    // 指定的配置项String[] value() default {};// 配置项等于这个值,才加载beanString havingValue() default "";// 如果没有配置项,是否生效/加载beanboolean matchIfMissing() default false;
3. @ConditionalOnClass (spring boot包下注解

存在指定的class,才会加载该bean。其他同2
参数: Class<?>[] value() default {};

4. @ConditionalOnBean (spring boot包下注解

存在指定的bean,才会加载该bean。其他同2

注解主要参数解释

 /*** 需要作为条件的类的Class对象数组*/Class<?>[] value() default {};/*** 需要作为条件的类的Name,Class.getName()*/String[] type() default {};/***  (用指定注解修饰的bean)条件所需的注解类*/Class<? extends Annotation>[] annotation() default {};/*** spring容器中bean的名字*/String[] name() default {};/*** 搜索容器层级,当前容器,父容器*/SearchStrategy search() default SearchStrategy.ALL;/*** 可能在其泛型参数中包含指定bean类型的其他类*/Class<?>[] parameterizedContainer() default {};
5. @ConditionalOnMissingClass (spring boot包下注解

不存在指定的class,才会加载该bean。其他同2
参数: Class<?>[] value() default {};

6. @ConditionalOnMissingBean (spring boot包下注解

不存在指定的bean,才会加载该bean。其他同2

注解主要参数解释

 /*** 需要作为条件的类的Class对象数组*/Class<?>[] value() default {};/*** 需要作为条件的类的Name,Class.getName()*/String[] type() default {};/**是否有需要过滤掉的子类*/Class<?>[] ignored() default {};/**同上,Class.getName()*/String[] ignoredType() default {};/***  (用指定注解修饰的bean)条件所需的注解类*/Class<? extends Annotation>[] annotation() default {};/*** spring容器中bean的名字*/String[] name() default {};/*** 搜索容器层级,当前容器,父容器*/SearchStrategy search() default SearchStrategy.ALL;/*** 可能在其泛型参数中包含指定bean类型的其他类*/Class<?>[] parameterizedContainer() default {};
7. @ConditionalOnCloudPlatform (spring boot包下注解

是否配置了SAP/CLOUD_FOUNDRY/HEROKU/KUBERNETES/等云平台 其他同2

8. @ConditionalOnExpression (spring boot包下注解

可通过spring提供的spEL表达式灵活配置 其他同2

9. @ConditionalOnJava (spring boot包下注解

可通过javaVersion限制是否加载该bean 其他同2

注解主要参数解释

// 需要比较的java版本
JavaVersion value();// 当前实际java版本如何与java比较,EQUAL_OR_NEWER代表更新才加载,OLDER_THAN代表版本更老才加载
Range range() default Range.EQUAL_OR_NEWER;
10. @ConditionalOnNotWebApplication (spring boot包下注解

当前不是web环境才加载 其他同2

11. @ConditionalOnWebApplication (spring boot包下注解

当前是web环境才加载 其他同2

12. @ConditionalOnWarDeployment (spring boot包下注解

当前是war包部署才加载 其他同2

13. @ConditionalOnWarDeployment (spring boot包下注解

当前是war包部署才加载 其他同2

14. @ConditionalOnResource (spring boot包下注解

String[] resources参数指定的静态资源文件存在,才加载 其他同2

15. @ConditionalOnSingleCandidate (spring boot包下注解

指定bean只有拥有唯一“候选bean”时,才加载 参数含义同ConditionalOnBean

condition系列注解全面罗列相关推荐

  1. 【Spring注解系列04】@Condition条件注解

    1.@Condition条件注解 满足指定条件,则会加载对应的实例或者类.该注解可以作用于类和方法上. @Condition类属性值中,对应的类,必须是实现Condition接口的类 2.实例 配置类 ...

  2. 详解Spring Boot框架中的@Conditional系列注解

    目录 1. @Conditional 注解 2. Spring boot 扩展 1) @ConditionalOnClass和@ConditionalOnMissingClass注解 2) @Cond ...

  3. SpringBoot @Conditional系列注解

    目录 @ConditionalOnClass.@ConditionalOnMissingClass @ConditionalOnBean.@ConditionalOnMissingBean @Cond ...

  4. SpringBoot整合RabbitMQ系列--注解的使用

    原文网址:SpringBoot整合RabbitMQ系列--注解的使用_IT利刃出鞘的博客-CSDN博客 简介 本文用实例介绍SpringBoot中RabbitMQ相关的注解. @RabbitListe ...

  5. spring系列-注解驱动原理及源码-bean组件注册

    目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...

  6. spring系列-注解驱动原理及源码-AOP使用及源码解析

    目录 一.用注解方式开启AOP 1.实例 2.AOP简单小结 二.AOP原理 1.@EnableAspectJAutoProxy溯源 2.AnnotationAwareAspectJAutoProxy ...

  7. spring系列-注解驱动原理及源码-声明式事务使用及原理解析

    目录 一.环境准备 1.JdbcTemplate使用实例 2.事务添加 二.声明式事务源码分析 1.原理(与AOP非常相似) 一.环境准备 1.JdbcTemplate使用实例 (1)pom文件添加依 ...

  8. spring系列-注解驱动原理及源码-自动装配

    目录 一.spring规范的bean自动注入 1.使用@Autowired自动注入 2.使用@Qualifier指定需要装配的组件 3.使用@Autowired装配null对象 4.使用@Primar ...

  9. spring系列-注解驱动原理及源码-bean生命周期

    目录 一.Bean的初始化和销毁 1.@Bean指定初始化和销毁方法 2.通过实现InitializingBean和Disposabean来初始化和销毁bean 3.使用JSR250定义的@PostC ...

最新文章

  1. 机器学习模型调参指南(附代码)
  2. MySQL主从复制简单设置
  3. gpio的8种工作模式_Stm32之GPIO工作模式简介
  4. C++中继承与虚函数示例
  5. 美团技术:到店结算平台实践(胶片)
  6. java中数据成员的初始化问题
  7. 利用rman配置DG环境
  8. matlab实现图片类型的转换
  9. 网站性能工具-YSlow的23个规则-网站性能优化
  10. 广州坐标系转换大地2000_如何将百度坐标转换为国家2000坐标系?
  11. MS-office计算机二级选择题大全
  12. video读取服务器本地的视频文件,javascript-video.js无法读取本地视频
  13. 授权(mining.authorize)与 auth_stratum函数
  14. 随机生成20个手机号码
  15. Pygame 简单打字游戏
  16. Excel所有批注相关的操作都在这里了。
  17. C语言实现状态机(二)
  18. 报错问题解决:net.sf.json.JSONException: There is a cycle in the hierarchy!
  19. 最常用的酒店IPTV系统实施方案
  20. 手机解除ppt文档密码保护,ppt权限密码如何解开?

热门文章

  1. 不能访问网络位置的解决方法:
  2. 怎么查找计算机上的网络路径,找不到网络路径怎么办
  3. vue.js之定义组件和子父组件数据传递及函数的相互调用
  4. 学会Sequelize,让你操作数据更丝滑
  5. 基于神经网络的物体识别方法2020[计算机视觉]
  6. 欧陆词典PEST2词库
  7. 通信基础之天线知识梳理---2022/12/05
  8. 学习FFmpeg API – 解码视频流程总结
  9. Android面试问答题总结
  10. UE的RRC状态切换