一、前言
在博文《SpringBoot系列十一》:精讲如何使用@Conditional系列注解做条件装配中我们讨论了如何使用@Conditional系列注解做条件装配,假如我想自定义条件装配改怎么做呢?
本文就如何自定义条件装配展开讨论。
二、@Conditional介绍
@Conditional注解是从spring4.0版本才有的,其是一个条件装配注解,可以用在任何类型或者方法上面,以指定的条件形式限制bean的创建;即当所有条件都满足的时候,被@Conditional标注的目标才会被spring容器处理。
- @Conditional本身也是一个父注解,从SpringBoot1.0版本开始派生出了大量的子注解;用于Bean的按需加载。
- @Conditional注解和其所有子注解必须依托于被
@Component衍生注解
标注的类,即Spring要能扫描到@Conditional衍生注解所在的类,才能做进一步判断。- @Conditional衍生注解可以加在类 或 类的方法上;加在类上表示类的所有方法都做条件装配、加在方法上则表示只有当前方法做条件装配。
1、@Conditional源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
/**
* All {@link Condition} classes that must {@linkplain Condition#matches match}
* in order for the component to be registered.
*/
Class<? extends Condition>[] value();
}
@Conditional注解只有一个value参数,类型是:Condition类型的数组;而Condition
是一个接口,其表示一个条件判断,内部的matches()
方法返回true或false;当所有Condition都成立时,@Conditional的条件判断才成立。
1)Condition接口
@FunctionalInterface
public interface Condition {
/**
* 判断条件是否匹配
* @param context 条件判断上下文