condition 系列注解全⾯罗列
在spring某些场景下,我们希望随着某些配置项/类的存在与否,决定⼀些bean是否被实例化并加载到spring容器。@Conditional系列注解,便是这个问题的解决⽅案。
⽂章⽬录
相关注解罗列
1. @Conditional 注解 (spring context 包下注解)
需要给定⼀个value参数,value必须继承Condition接⼝,实现match⽅法。举例:声明⼀个名为datasource的bean,我们希望只有在存在配置项 abled 并且为true时才加载该bean。2. @ConditionalOnProperty 注解 (spring boot 包下注解)
@ConditionalOnProperty 是springboot基于上述@Conditional注解实现的,他的功能单⼀但是使⽤上更加简单。当存在指定配置项为指定value时,该bean才会被加载。
在 1 中的需求,这⾥只需要⼀⾏注解便可以实现。@Configuration public class BeanConfig { @Conditional({DataSourceCondition.class}) @Bean(name = "datasource") public DataSource(){
return DataSource build = ate() .driverClassName("test") .url("test") .urname("test") .password("test") .build(); } }
1
2
3
4
5
6
7
8
9
10
11
腰花怎么做
12
13
14
15
16public class DataSourceCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { //获取ioc 使⽤的beanFactory ConfigurableListableBeanFactory beanFactory = BeanFactory(); ClassLoader classLoader = ClassLoader(); Environment environment = Environment(); BeanDefinitionRegistry registry = Registry(); String property = Property("abled"); if (property.equals(true)){ return true; } return fal; }}
1
2
3
4
5
6
经典好歌
7
8
9
10
11
12
13
14
15
16
17
注解主要参数解释
3. @ConditionalOnClass (spring boot 包下注解)存在指定的class,才会加载该bean。其他同2
参数: Class<?>[] value() default {};
4. @ConditionalOnBean (spring boot 包下注解)存在指定的bean,才会加载该bean。其他同2贯口大全
注解主要参数解释
5. @ConditionalOnMissingClass (spring boot 包下注解)不存在指定的class,才会加载该bean。其他同2
参数: Class<?>[] value() default {};@ConditionalOnProperty(name = "abled", havingValue = "true")@Bean(name = "datasource") public DataSource(){ return DataSource build = ate() .driverClassName("test") .url("test") .urname("test") .password("test") .build(); }
1
2
3
4
5
6
7
8
9
10 // 指定的配置项 String[] value() default {}; // 配置项等于这个值,才加载bean String havingValue() default ""; // 如果没有配置项,是否⽣效/加载bean boolean matchIfMissing() default fal;
1
2
3
4
5
6
7
8 /** * 需要作为条件的类的Class 对象数组 */ Class<?>[] value() default {}; /** * 需要作为条件的类的Name() */ String[] type() default {}; /** * (⽤指定注解修饰的bean)条件所需的注解类 */ Class<? extends Annotation>[] annotation() default {}; /** * spring 容器中bean 的名字 */ String[] name() default {}; /** * 搜索容器层级,当前容器,⽗容器 */ SearchStrategy arch() default SearchStrategy.ALL; /** * 可能在其泛型参数中包含指定bean 类型的其他类 */ Class<?>[] parameterizedContainer() default {};
1
2
3
4
5
6
7
8
什么云什么布
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
6. @ConditionalOnMissingBean (spring boot 包下注解)不存在指定的bean,才会加载该bean。其他同2
注解主要参数解释
7. @ConditionalOnCloudPlatform (spring boot 包下注解)是否配置了SAP/CLOUD_FOUNDRY/HEROKU/KUBERNETES/等云平台 其他同2
8. @ConditionalOnExpression (spring boot 包下注解)可通过spring提供的spEL表达式灵活配置 其他同2
9. @ConditionalOnJava (spring boot 包下注解)可通过javaVersion限制是否加载该bean 其他同2
注解主要参数解释
10. @ConditionalOnNotWebApplication (spring boot 包下注解)当前不是web环境才加载 其他同2 /** * 需要作为条件的类的Class 对象数组 */ Class<?>[] value() default {}; /** * 需要作为条件的类的Name() */ String[] type() default {}; /** 是否有需要过滤掉的⼦类 */ Class<?>[] ignored() default {}; /** 同上,Name() */ String[] ignoredType() default {}; /** * (⽤指定注解修饰的bean)条件所需的注解类 */ Class<? extends Annotation>[] annotation() default {}; /** * spring 容器中bean 的名字 */ String[] name() default {}; /** * 搜索容器层级,当前容器,⽗容器 */ SearchStrategy arch() default SearchStrategy.ALL; /** * 可能在其泛型参数中包含指定bean 类型的其他类 */ Class<?>[] parameterizedContainer() default {};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
内涵小故事15
16
17
18
19
20
21
22梦见西瓜是什么意思
23
24
25
26
27
28
29
30
31
32
33// 需要⽐较的java 版本JavaVersion value();// 当前实际java 版本如何与java ⽐较,EQUAL_OR_NEWER 代表更新才加载,OLDER_THAN 代表版本更⽼才加载Range range() default Range.EQUAL_OR_NEWER;
1
2
3
4
5
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