@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 这个注解也是一样。使用范围是组件上。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南