Springboot根据配置文件动态注入接口实现类

autowire加载指定实现类_Spring Boot 注入接口的所有实现类 Autowire all beans for a specific type这篇文章是参考 【spring自动注入接口的多个实现类(结合策略设计模式)】 得来的。按里面的内容敲了一下代码,总是有错误,然后自己又搜索一下,得到了正确结果:image.png图片来源:https://www.baeldung.com/spring-dynamic-autowire完整代码如下:策略接口:public i... 阅读详情

需求

最近在做一个Springboot项目,需要面向不同需求的客户,但是为了方便管理分支,需要将不同客户的需求都写到同一套代码中,根据不同客户实例化对应的实现类。

实现

为了尽量不修改代码,少做不必要的逻辑判断,我们考虑为不同客户写不同的Service,然后根据配置参数实例化对应的Service。这样就遇到了需要根据配置文件实现不同类的需求。

针对这一需求大致有两种实现方式。但是针对我的需求,能用的只有第二种,但还是想将第一种一起总结一下。

 

两种方式都需要给定义接口,并针对不同客户对接口做不同实现。

接口类

public interface IAService {

    //获取客户名,所有客户都需要,但是需要针对不同客户做不同实现
    String getCustomName();
}

针对客户A和B对上面接口实现两个类

//注意要给Service命名
@Service("customA")
public class IAServiceShijiazhuangImpl implements IAService{
   //A客户的逻辑
    @Override
    public String getCustomName() {
        return "客户A";
    }
}
//注意要给Service命名
@Service("customB")
public class IAServiceLinyiImpl implements IAService{
	//客户B的逻辑
    @Override
    public String getCityName() {
        return "客户B";
    }
}

Service层写好以后,需要在Controller层做不同的实现。有两种方式

1.使用@Qualifier注解

在@Qualifier("customA")上标明要实现的类的Service填写的名字即可。但是这种方式有个弊端。Qualifier注解的参数必须是常量,无法填写配置文件的值,因此无法使用配置文件动态注入,只能动手改代码,基本是鸡肋般的存在。

@RestController
public class AController {


    //如果要给客户A部署,这里写客户A Service注解的名称,上面配置的是customA
    @Qualifier("customA")
    IAService iaService;
    
    //不同地区需要有不同的逻辑,下面service实例化的正好是不同地区的实例
    @GetMapping("/name")
    public String getCustomName() {
        return iaService.getCityName();
    }
}

 

2.使用@Resource注解

上面配置了两个不同客户Service注解的名称,我们可以使用Resource注解,通过配置文件的方式进行动态注入。通过配置文件进行灵活切换。其实代码并没有多少改动,仅仅是换成了@Resource(name="${local.name}")而已,其中的local.name为从配置文件中要读取的变量对应的值。

@RestController
public class AController {

    //根据配置文件中配置的参数决定实例化哪个实现类,解决上面问题1
    @Resource(name="${local.name}")
    IAService iaService;
    
    //不同地区需要有不同的逻辑,下面service实例化的正好是不同地区的实例
    @GetMapping("/name")
    public String getCustomName() {
        return iaService.getCityName();
    }
}

 

 

 

 

 

【springboot】接口多实现类,选择性注入的4种解决方案 在SpringBoot环境下,当一个接口有多个实现类,怎么样根据配置方便快捷的切换实现类,并实现依赖注入?欢迎大家点击进来学习! 阅读详情

相关推荐

动态的装配bean,注入到Controller中

有时候根据需求会动态的装配bean,注入到Controller中,现在提供两种方式: 一、xml文件配置方式,ApplicationContext.xml 二、@PostConstruct注解方式

使用SpringBoot根据配置注入接口的不同实现类

SpringBoot根据配置注入接口的不同实现类

qi923701的博客 1277

SpringBoot-2.7.6读取配置文件的方式

SpringBoot-2.7.6读取配置文件的方式调试示例代码

SpringBoot根据配置注入接口的不同实现类

我们在使用springboot进行开发的时候经常用到@Autowired和@Resource进行依赖注入,但是当我们一个接口对应多个不同的实现类的时候如果不进行一下配置项目启动时就会报错,那么怎么根据不同的需求注入不同的类型就是一个值得考虑的问题,虽然@Autowired和@Resource就可以实现,但是我们也可以选择更加灵活的@ConditionalOnProperty注解来实现......

CodeXu-cyber的博客 3620

【电驱动】永磁同步电机工作原理及分类

永磁同步电机工作原理及分类

星Yeah 的博客 7331

在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记

日期:2025-09-09关键词:鲲鹏920、Atlas 300i Duo、银河麒麟V10、NPU、驱动、固件。

weixin_41544125的博客 2815

springboot:根据不同配置注入不同实现的bean

根据配置进行bean的注入

weixin_36236374的博客 2962

RTC时钟芯片替换代码移植-IIC通信

1、问题 RTC时钟芯片由爱普生RX-8010SJ更换成大普INS5710A,两者都是IIC通信,更换大普芯片后时钟不走、以及报掉电错误。仿真分析原因是CPU和RTC芯片收发数据延时不够导致,根据爱普生芯片手册,8010收发数据不采取延时,但大普芯片采用同样方式读取不行(需要加延时) 2、RX-8010SJ手册说明(以读取数据为例) (1)寄存器读操作时序图 指定地址读操作: 1)CPU 发送开始条件[S] 2)CPU 传输RX-8010SJ 的从地址,用R/W 位设定写模式 3)检测从RX-8010

weixin_42851683的博客 2066

利用反射读取配置文件中的具体实现类

该博客用于简单模拟如何利用反射读取配置文件中的具体实现类,一般框架的底层实现原理就是如此的。1、配置文件config.properties文件中的代码:#className=java.util.ArrayList className=java.util.HashSet 2、实例类ReflectPoint.java中的代码package cn.sunft.day01.reflect; /** *...

BruceLeeNumberOne的博客 712

基于R语言的DICE模型实践技术应用;预测不同减排路径下的经济增长、碳排放量、气候变化程度以及社会福利变化

DICE模型是一个动态综合气候经济模型,由诺贝尔经济学奖得主William Nordhaus开发,用于评估气候变化对经济的影响以及不同减排政策的经济成本和效益。以下是一个关于DICE模型在气候变化影响评估中的实际应用案例,结合R语言代码进行讲解。

KY_chenzhao的博客 869

单细胞拟时序分析实战:用monocle2从Seurat对象构建细胞轨迹(附完整代码)

本文提供了一套完整的单细胞拟时序分析实战教程,详细讲解了如何将Seurat对象转换为Monocle2的CellDataSet,并构建细胞命运轨迹。内容涵盖数据转换、轨迹定义基因选择、降维参数调优、可视化技巧及结果生物学验证,旨在帮助研究者解决实际分析中的常见问题,从静态细胞图谱中挖掘动态发育过程。

weixin_29251337的博客 342

一个接口有多个实现类

这样配置了之后,就算你在controller层 使用@Autowired注入,它显示的是@Bean注入异常,但是执行起来也不会报错。因为你已经配置过了,并不会出现bean注入异常的问题。这里介绍的是使用SpringBoot的@ConditionalOnProperty来完成指定执行实现类。以上就是解决同一接口有多个实现类的问题。当然还有其他的办法,这只是其中之一。havingValue:每个实现类的唯一标识,用这个来区分。name: 指定你的配置文件中的属性。

hello_word_demo1的博客 1230

【冷冻电镜】RELION5.0使用教程总结

对于您自己的数据,您可能希望使用各种倾斜系列对齐方法,然后比较每种方法生成的断层扫描图像的质量(参见下一步)。通过检查 CtfFind job 的 tilt_series 目录中的star文件来检查几个倾斜系列的散焦值。GitHub上也有人反应这个问题,目前我的解决方案是下载了较低版本的CTFFIND的,降级到4.1.10可以成功运行。此外,logfile.pdf 文件包含所有显微照片的有用参数图,例如散焦、像散、估计分辨率等,以及整个数据集中这些值的直方图。的目录,以及指向此目录的符号链接。

进阶中的程序员吃吃的博客 4239

spring boot 利用配置文件,实现数据动态注入

准备工作 首先在yml文件中,手动添加测试数据 方式1:@value 使用@Value("${}")注解来获取 说明:当spring容器启动时,会加载yml文件,动态实现数据封装,解析到@Value注解的时候,会根据key来查询spring中的map集合来获取value,从而赋值给对应属性。 @RestController //这个注解是@Controller+@ResponseBody的合体 public class JDBCController { @Value("${j..

小小苏的小小苏 774

【功能安全】软件安全架构

目录01 软件安全架构介绍02 软件架构设计模板03 软件架构设计示例 软件架构设计的目的 软件架构设计的原则 软件架构设计输入与输出 软件架构设计的要求 注:软件架构设计和软件安全要求之间的双向可追溯性。软件架构设计原则: 软件架构静态/动态设计(参考秒尼科技术) 软件架构静态设计 软件架构动态设计 软件分层架构设计 软件架构设计安全机制错误探测的安全机制 其中:数据的范围检查指输入输出数据的范围进行检查,例如:在程序中我们可以通过数据范围来排除数据的正确性;合理性检查 例如:使用参

weixin_36460584的博客 512

OpenClaw进阶实战(二十三):微信公众号接入——被动回复、客服消息、素材管理

本文介绍了将OpenClaw接入微信公众号的完整方案,重点包含以下内容: 接入方案选型:对比官方插件、三方服务和自建中转三种方式,选择自建Node.js中转服务实现灵活控制 核心原理:通过中转服务器完成微信消息协议转换,处理5秒超时限制和异步回复机制 实战开发: 搭建Express中转服务 实现Token管理和消息处理 采用内存缓存对话历史 通过客服接口异步回复 官方插件方案:介绍2026年发布的ClawBot插件,支持文本/图片/文件收发 进阶功能:包括素材管理接口调用示例 该方案适用于需要深度定制公众号

PeterPan的博客 142

SpringBoot中一个接口多个实现类,如何自由选择,这是一把《屠龙宝刀》

一个接口难免会有多个实现类,不同的实现类有各自的需求,如何在项目中实现根据不同项目,自由切换实现类呢? 废话不多说,直接上代码,文末有源码,直接测试 1.接口代码 package com.cj.interfaces; public interface ITestService { void test(); } 2.实现类1,使用@Service,且其中指定bean的名字为“s1” package com.cj.interfaces; import org.springframework.ste

我是Cj,一个正义之人 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

springboot中service层注入的是实现类,但Controller层接收的是接口

我们习惯这样编写代码: 在service层写接口,然后用实现类去实现接口,并且将实现类注入到容器中 @Service public class AccountServiceImpl implements AccountService {} 在controller层却是用接口操作service的bean的方法, @Autowired private AccountService userService; 为神魔这样? 理解: 1)注入的就是实现类,只不过拿接口来接收,接受的类型为接口,面向接口编程,那么为

qq_43842093的博客 6818

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

springboot通过不同的策略动态调用不同的实现类

1、前言 经常遇到这样的一个需求,前端传的实体类型相同,后端需要根据实体类中的某一个字符串,动态地调用某一个类的方法。 在SpringBoot中,我们可以理解成,一个Controller接口对应多个ServiceImpl,使用这种方式,如果后期需要添加一个功能,仅仅创建一个ServiceImpl就可以满足需求,而不用再额外创建一个Controller接口。 现在假设一个情景,前端传入不同的用户类型,后端返回该用户的任务。 你可能问我,为什么不直接把(用户类型,用户任务)存入数据库? 现在只是一个

迷茫,是因为才华配不上梦想... 6586

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

springboot——Spring下动态选择接口实现类(以多方式动态查询maxcompute为例)

前言 最近有个需求是需要通过数据源类型来动态切换数据源的操作,所有配置通过读取配置文件获取。与一般的选择实现类最大的区别是本文是动态选择,不需要通过@Qualifier注释写死实现类。看了下网上相关资料较少,且存在部分不一定正确的情况,故写此篇博客以作记录,也希望碰到此问题的小伙伴能够少走弯路。 注:本文以postgresql和maxcompute官方SDK两种查询方式查询maxcompute...

东天里的冬天 7643

【SpringBoot】使用不同的策略动态地调用某个接口的实现类

经常遇到这样的一个需求,前端传的实体类型相同,后端需要根据实体类中的某一个字符串,动态地调用某一个类的方法。 在SpringBoot中,我们可以理解成,一个Controller接口对应多个ServiceImpl,使用这种方式,如果后期需要添加一个功能,仅仅创建一个ServiceImpl就可以满足需求,而不用再额外创建一个Controller接口。 现在假设一个情景,前端传入不同的用户类型,后端...

阳阳的博客 8085

【SpringBoot】基于BeanDefinitionRegistryPostProcessor实现配置文件读取动态注入多个Bean

之前有写过一篇文章【设计模式】基于SpringBoot实现的策略模式,通过策略模式可以实现对于不同的参数,调用不同的bean,实现对于代码的最少侵入。基于这种方式,可以通过读取配置文件,注入到bean中,实现多个bean的配置方法。但是这种方式存在的问题就是: 配置文件每增加一个配置,需要增加一个bean配置类。 多个配置增加的时候容易遗漏,容易出错。 因此,本文将针对这种情况,基于BeanDefinitionRegistryPostProcessor实现配置文件读取动态注入多个Bean。 一、Be.

弱水提沧的博客 5213

在SpringBoot框架下,接口有几个实现类,在不改变任何源码的情况下,SpringBoot怎么知道给接口注入哪个实现类的依赖呢?

1.使用条件注解(如@ConditionalOnProperty)来根据应用程序的配置动态选择要注入的实现类是一种非常灵活的方法,它允许你根据配置文件中的属性值来决定要使用的实现类。首先,在实现类上使用@Component或@Service等注解进行标记,然后在依赖注入点使用@Qualifier注解来指定要注入的实现类的名称。在这个示例中,MyServiceConsumer通过自动注入MyService来获取实现类,根据配置中的属性值,将注入MyServiceImpl1或MyServiceImpl2。

sinian_sinian的博客 1537

springboot中一个service接口多个实现类,如何注入

一般来说我们的service接口都是只有一个实现类而已,但有些时候,确实会有两个实现类的情况,那这个时候我们怎么自动注入这个接口呢? 1、首先,有一个接口PersonService,然后再写两个实现类PersonServiceImp1、PersonServiceImp2 2、进行测试 如果我们直接注入接口的话,idea就会给我们报错 3、解决办法 其实自动注入时,它首先会先根据class类型来找到相应的实现类,如果这里有两个相同类型的实现类时,那我们可以通过实现类的id来找,比如说PersonServ

lihao1155的博客 1万+

spring自动注入接口的多个实现类(结合策略设计模式)

spring自动注入接口的多个实现类(结合策略设计模式)

weixin_48303059的博客 1443
上一篇: Typora 个性化设置
下一篇: 创建父子工程包含多个Springboot模块(2021.05.12)
iFence
博客等级 码龄9年 8051粉丝 111原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值