@ConditionalOnExpression 注解

@ConditionalOnExpression 注解

如果有一个基类,它下面有子类实现比如 v1, v2, v3 三个子类,但使用的时候,springboot 服务启动的时候,只想指定用其中的一种,这种情况要怎样做呢?

比如基类: RentPlan 出租计划
它有几个实现类 RentPlanV1, RentPlanV2, RentPlanV3

这三个实现类,希望用相同的名字注册到 spring 容器中。(这样在服务调用的时候,就更容易一些,不用管给过来的是什么策略,反正用的都是: rentPlan;

// 真正的实现类可能是 RentPlanV1, RentPlanV2, RentPlanV3 三个中的一个。
@Autowire
private RentPlan rentPlan;

如果这样启动,spring 会报错。因为相同的beanName 存在多个 bean 了。
怎么办呢?不想改代码,
总不能用个 if 语句吧。

如果可以在配置文件中,指定版本号,然后就可以加载不同的bean 就好了。
比如在配置文件中配置了 rent.version: V1, 就让 spring 加载 RentPlanV1, 然后 RentPlanV2, RentPlanV3 就不加载到 spirng 容器中了,但是代码是不用动的。
如果配置文件中配置了 rent.version: V2, 就让 spring 加载 RentPlanV2, 然后 RentPlanV1, RentPlanV3 就不加载到 spirng 容器中了

需求是清晰了,但要怎样实现呢:
@ConditionalOnExpression 这个注解,可以上场了。

比如想要用 V1, 就可以这样写

@Component
@ConditionalOnExpression("'${rent.version}'.equals('V1')")
public class RentPlanV1 extends RentPlan{
//...
}

注意

1、这个注解是可用于类/接口/枚举上,也可以用于方法上(但这个方法需要是 @Bean注解)
2、普通的方法是不生效的。。。
比如,这样是可以的

    @Bean
    @ConditionalOnProperty(prefix = "app.run", name = "enabled")
    public XBean getXBean() {
        ...
        return new XBean();
    }

@ConditionalOnProperty 这个注解也是一样。使用范围是组件上。

posted @ 2023-08-15 17:32  aaacarrot  阅读(113)  评论(0编辑  收藏  举报