当前位置: 首页 > news >正文

一个接口多个实现类,如何动态调用

方法一:使用ApplicationContext(也可以借助配置文件)

1、一个支付接口

package com.niuniu.order.service.pay;public interface PayService {String pay();
}

2、两种支付方法实现类

package com.niuniu.order.service.pay.impl;import com.niuniu.order.service.pay.PayService;
import org.springframework.stereotype.Service;@Service
public class ZfbPayServiceImpl implements PayService {@Overridepublic String pay() {return "zfb";}
}
package com.niuniu.order.service.pay.impl;import com.niuniu.order.service.pay.PayService;
import org.springframework.stereotype.Service;@Service
public class WeiXinPayServiceImpl implements PayService {@Overridepublic String pay() {return "weixin";}
}

3、自定义MyServiceFactory类

package com.niuniu.order.service.pay;import com.niuniu.order.service.pay.impl.WeiXinPayServiceImpl;
import com.niuniu.order.service.pay.impl.ZfbPayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;@Service
public class MyServiceFactory {@Autowiredprivate ApplicationContext applicationContext;public PayService getPayService(String beanName){switch (beanName){case ("zfbPayServiceImpl") :return applicationContext.getBean(ZfbPayServiceImpl.class);case ("weiXinPayServiceImpl") :return applicationContext.getBean(WeiXinPayServiceImpl.class);default:throw new IllegalArgumentException("Unknown service type!");}}
}

4、Controller调用

@Autowiredprivate MyServiceFactory myServiceFactory;@PostMapping("/pay")public Response pay(){
//        String s = myServiceFactory.getPayService("zfbPayServiceImpl").pay();String s = myServiceFactory.getPayService("weiXinPayServiceImpl").pay();return Response.ok(s);}

postman测试

方法二:使用Map存储各实现类的实例(策略模式)

package com.niuniu.order.service.pay;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.Map;@Service
public class MyServiceFactory2 {/*** key是bean名称*/private final Map<String, PayService> payServiceMap;@Autowiredpublic MyServiceFactory2(Map<String, PayService> payServiceMap) {this.payServiceMap = payServiceMap;}public PayService getPayService(String beanName){return payServiceMap.get(beanName);}
}

controller调用:

@Autowiredprivate MyServiceFactory2 myServiceFactory2;@PostMapping("/pay")public Response pay(){String s = myServiceFactory2.getPayService("zfbPayServiceImpl").pay();
//        String s = myServiceFactory2.getPayService("weiXinPayServiceImpl").pay();return Response.ok(s);}

http://www.dtcms.com/a/328803.html

相关文章:

  • 神经网络的核心组件解析:从理论到实践
  • ARM 实操 流水灯 按键控制 day53
  • Django REST Framework视图
  • HarmonyOS NDK的JavaScript/TypeScript与C++交互机制
  • Flask vs Django:微框架与一站式对决
  • web安全开发,在线%射击比赛管理%系统开发demo,基于html,css,jquery,python,django,三层mysql数据库
  • C# 异常处理与拦截全攻略:try/catch/finally、using、ASP.NET Core 中间件与过滤器一网打尽(含完整示例)
  • tRAP(tRNA 活性预测器)
  • Java开发主流框架搭配详解及学习路线指南
  • 二叉树的最小深度
  • Android 终端接入 GB28181 国标视频平台的完整解决方案解析
  • 【安卓,问题记录】ImageView 在布局顺序上位于 Button 上方,却出现图像内容被 Button 遮挡
  • AIOPS人才需具备的技术需求
  • 【完整源码+数据集+部署教程】火柴实例分割系统源码和数据集:改进yolo11-rmt
  • latex中“itemize”
  • 如何写出高质量的dify参数提取器prompt
  • 【P21】OpenCV Python——RGB和BGR,HSV和HSL颜色空间,及VScode中报错问题解决
  • vscode扩展应用 -koroFileHeader(jsdoc代码风格注释)
  • .net\c#web、小程序、安卓开发之基于asp.net家用汽车销售管理系统的设计与实现
  • InnoDB如何解决脏读、不可重复读和幻读的?
  • 天文与航天领域专业计算库介绍
  • C# 反射入门:如何获取 Type 对象?
  • Blender模拟结构光3D Scanner(一)外参数匹配
  • 决策树回归:用“分而治之”的智慧,搞定非线性回归难题(附3D可视化)
  • JS 与 C++ 双向通信实战:基于 WebHostViewListener 的消息处理机制
  • Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
  • 分布式与微服务宝典
  • 智能算法流程图在临床工作中的编程视角系统分析
  • 【docker①】在VS Code中使用Docker容器
  • 安全点(Safepoint)完成后唤醒暂停线程的过程