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都注入;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值