@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{
//...
}
标签:ConditionalOnExpression,spring,RentPlanV1,RentPlanV2,RentPlanV3,注解,加载
From: https://www.cnblogs.com/aaacarrot/p/17631960.html