@Conditional 是 Spring4 新提供的注解,它的作用是按照给定条件判断是否注册bean。
@Conditional的定义:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
由定义可以得出:
- @Conditional注解可以标注在类或者方法上
- @Conditional注解需要传入一个 Class 数组,该数组对象必须为 Condition 的子类。
Condition接口定义:
@FunctionalInterface
public interface Condition {
/**
* 确定条件是否匹配。
* @param context 上下文
* @param metadata 元数据
*/
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
上代码:
- 首先创建两个普通类
public class ConditionalBean1 {
public ConditionalBean1() {
System.out.println("----------------my name is conditional bean1");
}
}
public class ConditionalBean2 {
public ConditionalBean2() {
System.out.println("--------------------my name is conditional bean2");
}
}
- 然后分别创建这两个普通类对应的@Conditional注解类
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class Conditional1 implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}
public class Conditional2 implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
- 最后创建@Configuration进行这两个类的注入
@Configuration
public class ConditionalConfig {
@Conditional({Conditional1.class})
@Bean
public ConditionalBean1 getConditionalBean1() {
return new ConditionalBean1();
}
@Conditional({Conditional2.class})
@Bean
public ConditionalBean2 getConditionalBean2() {
return new ConditionalBean2();
}
}
控制台会输出结果:
----------------my name is conditional bean1
可见,当match方法返回true是,会注入这个bean,返回false,不会注入。
一个方法只能注入一个bean实例,所以@Conditional标注在方法上只能控制一个bean实例是否注入。
一个类中可以注入很多实例,@Conditional标注在类上就决定了一批bean是否注入。标注在类上实例代码为:
@Conditional({Conditional1.class, Conditional2.class})
@Configuration
public class ConditionalConfig {
@Bean
public ConditionalBean1 getConditionalBean1() {
return new ConditionalBean1();
}
@Bean
public ConditionalBean2 getConditionalBean2() {
return new ConditionalBean2();
}
}
经过测试,当Conditional1返回true,Conditional2放回false,两个bean都不注入;
Conditional1返回true,Conditional2返回true,两个bean都注入;