SpringBoot - 条件注解
@Conditional注解可以添加在@Configuration、@Component、@Service等修饰的类上用于控制对应的Bean是否需要创建,或者添加在@Bean修饰的方法上用于控制方法对应的Bean是否需要创建。
1.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 {};
}
@ConditionalOnSingleCandidate
注解用来判断指定类在 BeanFactory 中是否只有一个实例
如果在 BeanFactory 中存在多个实例,则匹配失败;如果在 BeanFactory 中仅仅存在一个实例,则匹配成功;
@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;
}
2.类作为条件
@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 {};
}