condition系列注解全面罗列
在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系列注解全面罗列相关推荐
- 【Spring注解系列04】@Condition条件注解
1.@Condition条件注解 满足指定条件,则会加载对应的实例或者类.该注解可以作用于类和方法上. @Condition类属性值中,对应的类,必须是实现Condition接口的类 2.实例 配置类 ...
- 详解Spring Boot框架中的@Conditional系列注解
目录 1. @Conditional 注解 2. Spring boot 扩展 1) @ConditionalOnClass和@ConditionalOnMissingClass注解 2) @Cond ...
- SpringBoot @Conditional系列注解
目录 @ConditionalOnClass.@ConditionalOnMissingClass @ConditionalOnBean.@ConditionalOnMissingBean @Cond ...
- SpringBoot整合RabbitMQ系列--注解的使用
原文网址:SpringBoot整合RabbitMQ系列--注解的使用_IT利刃出鞘的博客-CSDN博客 简介 本文用实例介绍SpringBoot中RabbitMQ相关的注解. @RabbitListe ...
- spring系列-注解驱动原理及源码-bean组件注册
目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...
- spring系列-注解驱动原理及源码-AOP使用及源码解析
目录 一.用注解方式开启AOP 1.实例 2.AOP简单小结 二.AOP原理 1.@EnableAspectJAutoProxy溯源 2.AnnotationAwareAspectJAutoProxy ...
- spring系列-注解驱动原理及源码-声明式事务使用及原理解析
目录 一.环境准备 1.JdbcTemplate使用实例 2.事务添加 二.声明式事务源码分析 1.原理(与AOP非常相似) 一.环境准备 1.JdbcTemplate使用实例 (1)pom文件添加依 ...
- spring系列-注解驱动原理及源码-自动装配
目录 一.spring规范的bean自动注入 1.使用@Autowired自动注入 2.使用@Qualifier指定需要装配的组件 3.使用@Autowired装配null对象 4.使用@Primar ...
- spring系列-注解驱动原理及源码-bean生命周期
目录 一.Bean的初始化和销毁 1.@Bean指定初始化和销毁方法 2.通过实现InitializingBean和Disposabean来初始化和销毁bean 3.使用JSR250定义的@PostC ...
最新文章
- 机器学习模型调参指南(附代码)
- MySQL主从复制简单设置
- gpio的8种工作模式_Stm32之GPIO工作模式简介
- C++中继承与虚函数示例
- 美团技术:到店结算平台实践(胶片)
- java中数据成员的初始化问题
- 利用rman配置DG环境
- matlab实现图片类型的转换
- 网站性能工具-YSlow的23个规则-网站性能优化
- 广州坐标系转换大地2000_如何将百度坐标转换为国家2000坐标系?
- MS-office计算机二级选择题大全
- video读取服务器本地的视频文件,javascript-video.js无法读取本地视频
- 授权(mining.authorize)与 auth_stratum函数
- 随机生成20个手机号码
- Pygame 简单打字游戏
- Excel所有批注相关的操作都在这里了。
- C语言实现状态机(二)
- 报错问题解决:net.sf.json.JSONException: There is a cycle in the hierarchy!
- 最常用的酒店IPTV系统实施方案
- 手机解除ppt文档密码保护,ppt权限密码如何解开?