spring--@Conditional详解

@Conditional的作用

@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。

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

@FunctionalInterface
public interface Condition {
    //根据返回的true 或者 false p判断是否注入对象
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

@Conditional的使用

以下案例来自nacos中的使用场景:用来区分单机环境和集群环境

//该接口有两个实现类
public interface CommonPersistService {
    void findTenantByKp();
}

//实现类1
@Conditional(value = ConditionOnExternalStorage.class)
@Service("externalOtherPersistServiceImpl")
public class ExternalCommonPersistServiceImpl implements CommonPersistService {
​​​​​​​    void findTenantByKp(){
        System.out.println("实现类1打印了-----");
    }
}

public class ConditionOnExternalStorage implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return true;
    }
}


//实现类2
@Conditional(value = ConditionOnEmbeddedStorage.class)
@Service("embeddedOtherPersistServiceImpl")
public class EmbeddedCommonPersistServiceImpl implements CommonPersistService {
    void findTenantByKp(){
        System.out.println("实现类2打印了-----");
    }
}

public class ConditionOnEmbeddedStorage implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return false;
    }
}


//使用
@Service
public class NamespaceOperationService {
    @resource
    private CommonPersistService commonPersistService;

    public List<Namespace> getNamespaceList() {
        commonPersistService.findTenantByKp();
    }
}


结果:实现类1打印了-----
因为实现类的@Conditional条件注解中的实现方法返回的true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中,@Conditional 和 @AutoConfigureAfter 是两个常用的注解,它们分别用于控制 Bean 的加载条件和 Bean 的加载顺序。下面分别对它们进行解析。 ## @Conditional @Conditional 注解用于控制 Bean 的加载条件,即只有满足指定的条件时,才会加载该 Bean。它的作用类似于 Spring Framework 中的 @Profile 注解,但更为灵活。 @Conditional 注解可以标注在配置类上或者 Bean 定义方法上,用于控制配置类或者 Bean 的加载条件。它的参数是一个实现了 Condition 接口的类,该类需要实现 matches 方法,用于指定 Bean 加载的条件。 下面是一个使用 @Conditional 注解的例子: ```java @Configuration @Conditional(MyCondition.class) public class MyConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` 这里,@Conditional(MyCondition.class) 指定了加载 MyConfig 配置类的条件,它的条件由 MyCondition 类中的 matches 方法指定。 ## @AutoConfigureAfter @AutoConfigureAfter 注解用于控制 Bean 的加载顺序,即指定在哪些 Bean 加载之后,才会加载当前 Bean。它的作用类似于 Spring Framework 中的 @DependsOn 注解,但更为灵活。 @AutoConfigureAfter 注解可以标注在配置类上或者 Bean 定义方法上,用于指定 Bean 加载的顺序。它的参数是一个字符串数组,指定了当前 Bean 依赖的其他 Bean 名称。 下面是一个使用 @AutoConfigureAfter 注解的例子: ```java @Configuration @AutoConfigureAfter({MyConfig1.class, MyConfig2.class}) public class MyConfig3 { @Bean public MyBean3 myBean3() { return new MyBean3(); } } ``` 这里,@AutoConfigureAfter({MyConfig1.class, MyConfig2.class}) 指定了在 MyConfig1 和 MyConfig2 配置类加载之后,才会加载 MyConfig3 配置类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值