首页 > 其他分享 >@ConditionalOnExpression 注解

@ConditionalOnExpression 注解

时间:2023-08-15 17:45:09浏览次数:34  
标签:ConditionalOnExpression spring RentPlanV1 RentPlanV2 RentPlanV3 注解 加载

@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

相关文章

  • 如何用Spring 原生注解 快速实现策略模式+工厂模式
    前言这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来,单独做一个微服务,实现企业交互逻辑的关注点分离。在这里面我很自然而然的就用到了策略模式+工厂模式的方式,包装内部实现细节,向外提供统一的调用方式,有效的减少if/else的业务代码,使......
  • spring boot注解
    1.测试运行环境:通过@RunWith和@SpringBootTest启动spring容器。@RunWith(SpringRunner.class),让测试运行于Spring测试环境@SpringBootTest(classes={RouteManageApplication.class})替代了spring-test中的@ContextConfiguration注解,目的是加载ApplicationContext,启动spring......
  • 注解与反射
    注解与反射1.注解1.1内置注解@SuppressWarnings("all")Stringname;1.2元注解负责解释其他注解@Target:表示注解可以用在哪些地方(class,method...)@Retention:表示注解在什么地方有效。runtime>class>sources@Documented:表示是否将我们的注解生成在javado......
  • @RequestParam,@PathParam,@PathVariable等注解区别
    @RequestParam和@PathVariable注解是用于从request中接收请求的,都可接收参数@RequestParam是从request里取值@PathVariable是从一个URI模板里面来填充@RequestParam示例URL如下:http://localhost:8080/springmvc/hello/101?param1=java&param2=edge复制获取代码:......
  • MyBatis--注解开发
    MyBatis注解开发MyBatis常用注解将映射文件替换为注解:publicinterfaceUserMapper{@Insert("insertintouservalue(...)")publicvoidsave(Useruser);@Update("")publicList<User>findAll();}其他delete,select等注解类似之后将之前核心配置文件中的加载......
  • 如何修改 Fiori Elements 工程包含的本地注解(annotations)文件试读版
    本教程前一篇文章:8.如何找到SAPFioriElements应用某个字段显示值具体的数据源,笔者试图解答我的知识星球里一个朋友的提问:在WebIde(SAPUI版本1.97.0)生成FioriElements的Overviewpage并发布后,再次在消费视图中修改UI注解后,本地运行该Overviewpage应用发现页面已经变动,......
  • TestNG注解-方法注解(1,BeforeMethod和AfterMethod 2,BeforeClass和AfterClass 3,BeforeSu
    packagecom.course.testng;importorg.testng.annotations.*;publicclassBasicAnootation{//最基本的注解用来把方法标记为测试的一部分@TestpublicvoidtestCase1(){System.out.println("这是测试用例1");}@Testpublicvoidt......
  • 注解和反射
    注解和反射1、注解什么是注解?类似@Override注解,注解可以被其他程序所读取,进行信息处理1.1内置注解就是jdk自带的注解如@Override:定义在java.lang.Override中,只适用于修辞方法,表示当前被修辞的方法用于从写父类中的另一个方法​ @Deprecaed:该注解的作用是修辞方法,属性,类,告诉......
  • SpringBoot复习:(19)Condition接口和@Conditional注解
    Condition接口代码如下:publicinterfaceCondition{ booleanmatches(ConditionContextcontext,AnnotatedTypeMetadatametadata);}它是一个函数式接口,只有一个方法matches用来表示条件是否满足。matches方法中的ConditionContext类对象context可以通过getEnvironment方法获......
  • jpa 注解
    转: 核心提示:JPA注解的几个要点1.设置Pojo为实体@Entity//标识这个pojo是一个jpa实体publicclassUsersimplementsSerializable{}2.设置表名@Entity@Table(name=users)//指定表名为userspublicclassUsersimplementsSerializable{}3.设置主键publicJPA......