SpringBoot条件注解
SpringBoot条件注解@Conditional,可⽤于根据某个特定的条件来判断是否需要创建某个特定的Bean。SpringBoot⾃动配置功能⾥⾯就⼤量的使⽤了条件注解。接下来我们就对@Conditional的使⽤做⼀个简单的介绍。
@Conditional注解需要和Condition接⼝搭配⼀起使⽤。通过对应Condition接⼝来告知是否满⾜匹配条件。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
/**
* 所有⽤于匹配的Condition接⼝(实现该接⼝的类),只有这些类都返回true才认为是满⾜条件
*/
Class<? extends Condition>[] value();
}
@Conditional注解可以添加在@Configuration、@Component、@Service等修饰的类上⽤于控制对应的Bean是否需要创建,或者添加在@Bean修饰的⽅法上⽤于控制⽅法对应的Bean是否需要创建。
@Conditional添加在@Configuration修饰的类上,⽤于控制该类和该类⾥⾯所有添加的@Bean⽅法对应的Bean是否需要创建。
⼀ @Conditional扩展注解
为了⽅便我们的使⽤Spring Boot对@Conditional条件注解做了⼀些扩展,提供了⼀些很实⽤的扩展性条件注解。
条件注解Condition处理类实例解释
@ConditionalOnBean OnBeanCondition@ConditionalOnBean(DataSource.class)Spring 容器中不存在对应的实例⽣
@ConditionalOnMissingBean OnBeanCondition@ConditionalOnMissingBean(name = “redisTemplate”)Spring 容器中不存在对应的实例⽣
@ConditionalOnSingleCandidate OnBeanCondition@ConditionalOnSingleCandidate(FilteringNotifier.class)Spring 容器中是否存在且只存在⼀个对应的实例,或者虽然有多个但 是指定⾸选的Bean ⽣效
@ConditionalOnClass OnClassCondition@ConditionalOnClass(RedisOperations.class)类加载器中存在对应的类⽣效
@ConditionalOnMissingClass OnClassCondition@ConditionalOnMissingClass(RedisOperations.class)类加载器中不存在对应的类⽣效
@ConditionalOnExpression OnExpressionCondition@ConditionalOnExpression(“’${server.host}’==’localhost’”)
判断SpEL 表达式成⽴⽣效
@ConditionalOnJava OnJavaCondition@ConditionalOnJava(JavaVersion.EIGHT)
指定Java版本符合要求⽣
@ConditionalOnProperty OnPropertyCondition @ConditionalOnProperty(prefix = “spring.aop”, name =
“auto”, havingValue = “true”, matchIfMissing = true)
应⽤环
境中的
属性满
⾜条件
⽣效
@ConditionalOnResource OnResourceCondition@ConditionalOnResource(resources=”l”)存在指定的资源⽂件⽣效
@ConditionalOnWebApplication OnWebApplicationCondition 当前应⽤是Web应⽤⽣效
@ConditionalOnNotWebApplication OnWebApplicationCondition 当前应⽤不是Web应⽤⽣效
条件注解Condition处理类实例解释
上⾯的扩展注解我们可以简单的分为以下⼏类:
Bean作为条件:@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnSingleCandidate。
类作为条件:@ConditionalOnClass、@ConditionalOnMissingClass。
SpEL表达式作为条件:@ConditionalOnExpression。
JAVA版本作为条件: @ConditionalOnJava
配置属性作为条件:@ConditionalOnProperty。
资源⽂件作为条件:@ConditionalOnResource。
是否Web应⽤作为判断条件:@ConditionalOnWebApplication、@ConditionalOnNotWebApplication。
1.1 Bean作为条件
1.1.1 @ConditionalOnBean
@ConditionalOnBean对应的Condition处理类是OnBeanCondition。如果Spring容器⾥⾯存在指定的Bean则⽣效。
@ConditionalOnBean配置参数
public @interface ConditionalOnBean {
/**
* 需要作为条件的类的Class对象数组
*/
Class<?>[] value() default {};
/**
* 需要作为条件的类的Name, Name()
*/
String[] type() default {};
/**
* (⽤于指定注解修饰的Bean)条件所需的注解类
*/
Class<? extends Annotation>[] annotation() default {};
/**
* Spring容器中Bean的名字
*/
String[] name() default {};
/**
* 搜索容器层级,当前容器,⽗容器
*/
SearchStrategy search() default SearchStrategy.ALL;
/**
* 可能在其泛型参数中包含指定Bean类型的其他类
*/
Class<?>[] parameterizedContainer() default {};
}
1.1.2 @ConditionalOnMissingBean
@ConditionalOnMissingBean对应的Condition实现类是OnBeanCondition。如果Spring容器⾥⾯不存在指定的Bean则⽣效。
@ConditionalOnMissingBean配置参数
public @interface ConditionalOnMissingBean {
/**
* 需要作为条件的类的Class对象数组
*/
Class<?>[] value() default {};
/**
* 需要作为条件的类的Name, Name()
*/
String[] type() default {};
/**
* 匹配Bean的时候需要忽视的Class对象数组,⼀般是⽗类
* @ConditionalOnMissingBean(value = JdbcFactory.class, ignored = MySqlDefaultFactory.class)
*/
Class<?>[] ignored() default {};
/**
* 匹配Bean的时候需要忽视的类的Name, Name()
*/
String[] ignoredType() default {};
/**
* (⽤于指定注解修饰的Bean)条件所需的注解类
*/
Class<? extends Annotation>[] annotation() default {};
/**
* Spring容器中Bean的名字
*/
String[] name() default {};
/**
* 搜索容器层级,当前容器,⽗容器
*/
SearchStrategy search() default SearchStrategy.ALL;
/
**
* 可能在其泛型参数中包含指定Bean类型的其他类
*/
Class<?>[] parameterizedContainer() default {};
}
⽐如如下的实例,当容器⾥⾯不存在redisTemplate对应的Bean的时候,就会创建⼀个RedisTemplate添加到容器⾥⾯去。
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
1.1.3 @ConditionalOnSingleCandidate
@ConditionalOnSingleCandidate对应的Condition处理类是OnBeanCondition。如果当指定Bean在容器中只有⼀个,或者虽然有多个但是指定⾸选Bean的时候则⽣效。
@ConditionalOnSingleCandidate配置参数
public @interface ConditionalOnSingleCandidate {
/**
* 需要作为条件的类的Class对象
*/
Class<?> value() default Object.class;
/**
* 需要作为条件的类的Name, Name()
*/
String type() default "";
/**
* 搜索容器层级,当前容器,⽗容器
*/
SearchStrategy search() default SearchStrategy.ALL;
}
1.2 类作为条件
1.2.1 @ConditionalOnClass
@ConditionalOnClass对应的Condition处理类是OnClassCondition。如果当前类路径下⾯有指定的类的时候则⽣效。
@ConditionalOnClass配置属性介绍
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnClass {
/**
* 需要作为条件的类的Class对象数组
*/
Class<?>[] value() default {};
/**
* 需要作为条件的类的Name, Name()
*/
String[] name() default {};
}
1.2.2 @ConditionalOnMissingClass
@ConditionalOnMissingClass对应的Condition处理类是OnClassCondition。如果当前类路径下⾯没有指定的类的时候则⽣效。springboot aop
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnMissingClass {
/**
* 需要作为条件的类的Name, Name()
*/
String[] value() default {};
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。