Spring 中 @Conditional注解

@Conditional 是 Spring4 新提供的注解,它的作用是按照给定条件判断是否注册bean。

@Conditional的定义:

@Target({
     ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
     
   Class<? extends Condition>[] value();
}

由定义可以得出:

  1. @Conditional注解可以标注在类或者方法上
  2. @Conditional注解需要传入一个 Class 数组,该数组对象必须为 Condition 的子类。

Condition接口定义:

@FunctionalInterface
public interface Condition {
     
   /**
    * 确定条件是否匹配。
    * @param context 上下文
    * @param metadata 元数据
    */
   boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

上代码:

  1. 首先创建两个普通类
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");
    }
}
  1. 然后分别创建这两个普通类对应的@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;
    }
}
  1. 最后创建@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都注入;

你可能感兴趣的:(#,Spring)