iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >springboot怎么通过不同的策略动态调用不同的实现类
  • 236
分享到

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

2023-06-29 08:06:22 236人浏览 泡泡鱼
摘要

这篇“SpringBoot怎么通过不同的策略动态调用不同的实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springb

这篇“SpringBoot怎么通过不同的策略动态调用不同的实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot怎么通过不同的策略动态调用不同的实现类”文章吧。

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

经常遇到这样的一个需求,前端传的实体类型相同,后端需要根据实体类中的某一个字符串,动态地调用某一个类的方法。

在SpringBoot中,我们可以理解成,一个Controller接口对应多个ServiceImpl,使用这种方式,如果后期需要添加一个功能,仅仅创建一个ServiceImpl就可以满足需求,而不用再额外创建一个Controller接口。

现在假设一个情景,前端传入不同的用户类型,后端返回该用户的任务。

你可能问我,为什么不直接把(用户类型,用户任务)存入数据库

现在只是一个简单的场景而已,实际中更为复杂,无法直接存入数据库。

代码演示

我们先定义一个接口

public interface UserService {     //返回用户的主要任务    String task();}

两个实现类

@Service("student")public class StudentServiceImpl implements UserService {    @Override    public String task() {        return "学习";    }}
@Service("teacher")public class TeacherServiceImpl implements UserService {    @Override    public String task() {        return "教书";    }}

实现动态调用的核心类

@Servicepublic class UserContext {     @Autowired    Map<String, UserService> userMap;     public UserService getUserService(String type) {        return userMap.get(type);    }}

Spring会自动地将形如(@Service后面的名称,实现该接口的类)注入到该userMap中

在启动后,userMap中就存在两个元素,("student",StudentServiceImpl)与("teacher",TeacherServiceImpl)

getUserService方法返回userMap中key=type的UserService对象

实体类

public class User {     private String type;     private String task;     public String getType() {        return type;    }     public void setType(String type) {        this.type = type;    }     public String getTask() {        return task;    }     public void setTask(String task) {        this.task = task;    }}

Controller层接口

@RestController@RequestMapping("/user")public class UserController {     @Autowired    UserContext userContext;     @PostMapping("/getTask")    public String getTask(@RequestBody User user) {        UserService userService = userContext.getUserService(user.getType());        return userService.task();    }}

测试样例:

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

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

可能用到的场景举例

关于库存的仪表盘统计

前端传入区域id,仓库id,物品id等信息

后端依据参数动态地选择某一个物品实现类,最后返回统计的信息。

这里有几个问题,为什么不一次性将所有物品id传入,一次性获取所有物品的库存?

一次性传入,可能后端处理时间边长,失败率也高,一旦失败,整个仪表盘没有任何数据。而且后期可能面临的一个需求,不同的物品,需要有不同的接口刷新速度,畅销的物品接口调用频率快。所以可能需要将物品分组,一个小组是同一种类型,使用一个实现类。

比如,这里有100种物品,按类型或者其他属性分成了10组,每个组之间,有一个不同的属性groupId,但10组共用一个接口,进入接口后,再进入10个不同的实现类,在实现类中调用具体的计算逻辑。

spring中动态选择实现类

在spring中当一个接口有多个实现类的时候,通过创建简单工厂类,根据传入的不同的参数获取不同的接口实现类。

public interface ExecuteService {        ExecuteEnum getCode();    // 业务方法    void execute();}
@Servicepublic class FirstExecuteServiceImpl implements ExecuteService {        @Override    public ExecuteEnum getCode() {        return ExecuteEnum.FIRST;    }        public void execute() {        System.out.println("11111111111");    }}
@Servicepublic class SecondExecuteServiceImpl implements ExecuteService {        @Override    public ExecuteEnum getCode() {        return ExecuteEnum.SECOND;    }        public void execute() {        System.out.println("222222222");    }}
    public enum ExecuteEnum {        FIRST,        SECOND,;    }

方案一

@Componentpublic class ExecuteServiceFactory implements ApplicationContextAware {        private final static Map<ExecuteEnum, ExecuteService> EXECUTE_SERVICES = new HashMap<>();    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        Map<String, ExecuteService> types = applicationContext.getBeansOfType(ExecuteService.class);        types.values().forEach(e -> EXECUTE_SERVICES.putIfAbsent(e.getCode(), e));    }    }

方案二

@Componentpublic class ExecuteServiceFactory implements InitializingBean {    @Autowired    private List<ExecuteService> executeServices;    public final static Map<ExecuteEnum, ExecuteService> EXECUTE_SERVICES = new HashMap<>();    @Override    public void afterPropertiesSet() throws Exception {        executeServices.forEach(l -> EXECUTE_SERVICES.putIfAbsent(l.getCode(), l));    }}

以上就是关于“springboot怎么通过不同的策略动态调用不同的实现类”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: springboot怎么通过不同的策略动态调用不同的实现类

本文链接: https://www.lsjlt.com/news/323530.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot怎么通过不同的策略动态调用不同的实现类
    这篇“springboot怎么通过不同的策略动态调用不同的实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springb...
    99+
    2023-06-29
  • springboot如何通过不同的策略动态调用不同的实现类
    目录通过不同的策略动态调用不同的实现类代码演示可能用到的场景举例spring中动态选择实现类方案一方案二通过不同的策略动态调用不同的实现类 经常遇到这样的一个需求,前端传的实体类型相...
    99+
    2024-04-02
  • 使用spring动态获取接口的不同实现类
    目录spring动态获取接口的不同实现类当时想到了两种解决办法获取某接口所有实现类正文结果spring动态获取接口的不同实现类 最近做项目,有个需求是和外部对接,从接口获取新闻数据,...
    99+
    2024-04-02
  • 如何使用spring动态获取接口的不同实现类
    这篇“如何使用spring动态获取接口的不同实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用spring动态获取...
    99+
    2023-06-29
  • SpringBoot 如何通过 Profile 实现不同环境下的配置切换
    目录一、搭建工程二、多文件配置方式三、多片段配置方式四、使用外部配置文件SpringBoot 通过 profile 实现在不同环境下的配置切换,比如常见的开发环境、测试环境、生产环境...
    99+
    2022-11-13
    SpringBoot 配置切换 SpringBoot  Profile配置切换
  • Feign 集成 Hystrix实现不同的调用接口不同的设置方式
    问题描述 小编在写项目时遇到一个需求: 假设现在有三个项目A、B、C,其中A、B作为服务提供方,C作为调用方,需要实现C在调用A、B时实现不同的超时时间,比如C调用A时超时是2s,调...
    99+
    2024-04-02
  • 不同类型的 C++ GUI 库如何利用函数实现不同的功能?
    是的,c++++ 具有多种 gui 库,提供函数实现不同 gui 功能。qt 提供:qpushbutton(按钮)、qvboxlayout(垂直布局)、qtabwidget(选项卡窗口)...
    99+
    2024-04-25
    函数 c++ gui c++
  • Nagios怎么处理不同类型的通信协议
    Nagios是一个开源的监控系统,通常用于监控网络设备、服务器和应用程序等。它支持监控不同类型的通信协议,包括但不限于SNMP、HT...
    99+
    2024-04-02
  • JS怎么实现给不同元素设置不同的定时器
    这篇文章主要讲解了“JS怎么实现给不同元素设置不同的定时器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么实现给不同元素设置不同的定时器”吧!案例效果:上面的紫色盒子打开页面会自己移动...
    99+
    2023-07-02
  • vbscript怎么实现根据不同时间段显示不同的欢迎语
    本篇内容介绍了“vbscript怎么实现根据不同时间段显示不同的欢迎语”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本例中,VBScript...
    99+
    2023-06-08
  • C++中怎么实现不同机器上的进程间通信
    在C++中,可以使用不同的方法来实现不同机器上的进程间通信,其中一种常用的方法是使用网络通信。下面是一些常用的实现方式: 使用T...
    99+
    2024-04-02
  • 使用SpringBoot根据配置注入接口的不同实现类(代码演示)
    目录一.引言二.代码演示1.问题描述2.解决方案2.1使用@Autowired的时候将接口变量名改为实现类的限定名2.2 使用@Autowired配合@Qualifier指定限定名注...
    99+
    2024-04-02
  • 小程序怎么调用不同页面的函数
    小程序调用不同页面函数的案例:函数写在对应的js文件,代码如下:function formatTime(date) {var year = date.getFullYear()var&nbs...
    99+
    2024-04-02
  • php怎么实现两张不同的表分页
    这篇文章将为大家详细讲解有关php怎么实现两张不同的表分页,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php实现两张不同表分页的方法:1、创建一个PHP示例文件;2、通过“function getPag...
    99+
    2023-06-25
  • Vue中的同步调用和异步调用怎么实现
    这篇“Vue中的同步调用和异步调用怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中的同步调用和异步调用怎么实现...
    99+
    2023-06-28
  • 利用Go语言实现不同数据类型的输出操作
    标题:利用Go语言实现不同数据类型的输出操作 Go语言作为一种简洁、高效的编程语言,提供了丰富的标准库,能够方便地操作不同数据类型并进行输出。本文将介绍如何利用Go语言实现对不同数据类...
    99+
    2024-03-15
    go语言输出数据 数据类型输出 不同数据输出 go语言 标准库
  • CSS+JavaScript怎么实现页面不同布局的切换
    这篇文章主要介绍“CSS+JavaScript怎么实现页面不同布局的切换”,在日常操作中,相信很多人在CSS+JavaScript怎么实现页面不同布局的切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用...
    99+
    2024-04-02
  • 怎么使用Spring特性实现接口多类的动态调用
    今天小编给大家分享一下怎么使用Spring特性实现接口多类的动态调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正好用到。...
    99+
    2023-06-29
  • Java怎么优雅的调用dubbo同时不使用其它jar包
    本文小编为大家详细介绍“Java怎么优雅的调用dubbo同时不使用其它jar包”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么优雅的调用dubbo同时不使用其它jar包”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-05
  • HDFS怎么实现数据在不同存储层之间的自动迁移
    在HDFS中,数据在不同存储层之间的自动迁移通常是通过数据生命周期管理功能来实现的。数据生命周期管理功能可以根据数据的访问频率、存储...
    99+
    2024-05-08
    HDFS
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作