条件注解
条件注解 | 解释 | 实例 |
---|---|---|
@ConditionalOnBean | Spring容器中存在对应的实例生效 | @ConditionalOnBean(DataSource.class) |
@ConditionalOnMissingBean | Spring容器中不存在对应的实例生效 | @ConditionalOnMissingBean(name = "redisTemplate") |
@ConditionalOnSingleCandidate | Spring容器中是否存在且只存在一个对应的实例,或者虽然有多个但 是指定首选的Bean生效 | @ConditionalOnSingleCandidate(FilteringNotifier.class) |
@ConditionalOnClass | 类加载器中存在对应的类生效 | @ConditionalOnClass(RedisOperations.class) |
@ConditionalOnMissingClass | 类加载器中不存在对应的类生效 | @ConditionalOnMissingClass(RedisOperations.class) |
@ConditionalOnExpression | 判断SpEL 表达式成立生效 | @ConditionalOnExpression("'${server.host}'=='localhost'") |
@ConditionalOnJava | 指定Java版本符合要求生效 | @ConditionalOnJava(JavaVersion.EIGHT) |
@ConditionalOnProperty | 应用环境中的属性满足条件生效 | @ConditionalOnProperty(prefix ="spring.aop", name = "auto", havingValue = "true", matchIfMissing = true) |
@ConditionalOnResource | 存在指定的资源文件生效 | @ConditionalOnResource(resources="mybatis.xml") |
@ConditionalOnWebApplication | 当前应用是Web应用生效 | @ConditionalOnWebApplication |
@ConditionalOnNotWebApplication | 当前应用不是Web应用生效 | @ConditionalOnNotWebApplication |
条件注解分类
- Bean作为条件:@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnSingleCandidate。
- 类作为条件:@ConditionalOnClass、@ConditionalOnMissingClass。
- SpEL表达式作为条件:@ConditionalOnExpression。
- JAVA版本作为条件: @ConditionalOnJava
- 配置属性作为条件:@ConditionalOnProperty。
- 资源文件作为条件:@ConditionalOnResource。
- 是否Web应用作为判断条件:@ConditionalOnWebApplication、@ConditionalOnNotWebApplication。
目录
Bean作为条件
@ConditionalOnBean
@ConditionalOnBean对应的Condition处理类是OnBeanCondition。如果Spring容器里面存在指定的Bean则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnBean {
/**
* 需要作为条件的类的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 {};
}
@ConditionalOnMissingBean
@ConditionalOnMissingBean对应的Condition实现类是OnBeanCondition。如果Spring容器里面不存在指定的Bean则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnMissingBean {
/**
* 需要作为条件的类的Class对象数组
*/
Class<?>[] value() default {};
/**
* 需要作为条件的类的Name, Class.getName()
*/
String[] type() default {};
/**
* 匹配Bean的时候需要忽视的Class对象数组,一般是父类
* @ConditionalOnMissingBean(value = JdbcFactory.class, ignored = MySqlDefaultFactory.class)
*/
Class<?>[] ignored() default {};
/**
* 匹配Bean的时候需要忽视的类的Name, 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 {};
}
比如当容器里面不存在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;
}
@ConditionalOnSingleCandidate
@ConditionalOnSingleCandidate对应的Condition处理类是OnBeanCondition。如果当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean的时候则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnSingleCandidate {
/**
* 需要作为条件的类的Class对象
*/
Class<?> value() default Object.class;
/**
* 需要作为条件的类的Name, Class.getName()
*/
String type() default "";
/**
* 搜索容器层级,当前容器,父容器
*/
SearchStrategy search() default SearchStrategy.ALL;
}
类作为条件
@ConditionalOnClass
@ConditionalOnClass对应的Condition处理类是OnClassCondition。如果当前类路径下面有指定的类的时候则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnClass {
/**
* 需要作为条件的类的Class对象数组
*/
Class<?>[] value() default {};
/**
* 需要作为条件的类的Name, Class.getName()
*/
String[] name() default {};
}
@ConditionalOnMissingClass
@ConditionalOnMissingClass对应的Condition处理类是OnClassCondition。如果当前类路径下面没有指定的类的时候则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnMissingClass {
/**
* 需要作为条件的类的Name, Class.getName()
*/
String[] value() default {};
}
SpEL表达式作为条件
@ConditionalOnExpression对应的Condition处理类是OnExpressionCondition。只有当SpEL表达式满足条件的时候则生效。
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnExpressionCondition.class)
public @interface ConditionalOnExpression {
/**
* 要作为条件的SpEL表达式
*/
String value() default "true";
}
例如@ConditionalOnExpression("${test.enabled:true}") ,只有当配置文件里面存在test.enabled: true的时候则生效。
JAVA版本作为判断条件
@ConditionalOnJava对应的Condition处理类是OnJavaCondition。只有当指定的JAVA版本条件满足的时候,才会创建对应的Bean。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnJavaCondition.class)
public @interface ConditionalOnJava {
/**
* 比较方式,Range.EQUAL_OR_NEWER:当前版本等于或高于、Range.OLDER_THAN:当前版本老于,越早的版本越老
*/
Range range() default Range.EQUAL_OR_NEWER;
/**
* 指定JAVA版本
*/
JavaVersion value();
/**
* Range options.
*/
enum Range {
/**
* Equal to, or newer than the specified {@link JavaVersion}.
*/
EQUAL_OR_NEWER,
/**
* Older than the specified {@link JavaVersion}.
*/
OLDER_THAN
}
}
配置属性作为判断条件
@ConditionalOnProperty对应的Condition实现类OnPropertyCondition。只有当对应的配置属性和给定条件的值相等的时候则生效。
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
/**
* 对应property名称的值
*/
String[] value() default {};
String[] name() default {};
/**
* property名称的前缀,可有可无
*/
String prefix() default "";
/**
* 与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
*/
String havingValue() default "";
/**
* 缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错
*/
boolean matchIfMissing() default false;
}
资源文件是否存在作为判断条件
@ConditionalOnResource对应的Condition处理类OnResourceCondition。只有当指定的资源文件出现在classpath中则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnResourceCondition.class)
public @interface ConditionalOnResource {
/**
* 要作为判断条件的资源文件名称 @ConditionalOnResource(resources=”mybatis.xml”)
*/
String[] resources() default {};
}
是否Web应用作为判断条件
@ConditionalOnWebApplication
@ConditionalOnWebApplication对应的Condition处理类是OnWebApplicationCondition。只有当当前项目是Web项目的时候则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnWebApplicationCondition.class)
public @interface ConditionalOnWebApplication {
/**
* 需要作为条件的Web应用程序的必需类型
*/
Type type() default Type.ANY;
/**
* Available application types.
*/
enum Type {
/**
* 任何web应用都将匹配
*/
ANY,
/**
* 仅基于servlet的Web应用程序将匹配
*/
SERVLET,
/**
* 仅基于反应式的Web应用程序将匹配
*/
REACTIVE
}
}
@ConditionalOnNotWebApplication
@ConditionalOnNotWebApplication对应的Condition处理类是OnWebApplicationCondition。只有当当前项目不是Web项目的时候则生效。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnWebApplicationCondition.class)
public @interface ConditionalOnNotWebApplication {
}