分享

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

 wwq图书世界 2024-01-23 发布于山东

1、前言

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

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

2、代码演示

我们先定义一个接口

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

两个实现类

  1. @Service("student")
  2. public class StudentServiceImpl implements UserService {
  3. @Override
  4. public String task() {
  5. return "学习";
  6. }
  7. }
  1. @Service("teacher")
  2. public class TeacherServiceImpl implements UserService {
  3. @Override
  4. public String task() {
  5. return "教书";
  6. }
  7. }

实现动态调用的核心类

  1. @Service
  2. public class UserContext {
  3. @Autowired
  4. Map<String, UserService> userMap;
  5. public UserService getUserService(String type) {
  6. return userMap.get(type);
  7. }
  8. }

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

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

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

实体类

  1. public class User {
  2. private String type;
  3. private String task;
  4. public String getType() {
  5. return type;
  6. }
  7. public void setType(String type) {
  8. this.type = type;
  9. }
  10. public String getTask() {
  11. return task;
  12. }
  13. public void setTask(String task) {
  14. this.task = task;
  15. }
  16. }

Controller层接口

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. UserContext userContext;
  6. @PostMapping("/getTask")
  7. public String getTask(@RequestBody User user) {
  8. UserService userService = userContext.getUserService(user.getType());
  9. return userService.task();
  10. }
  11. }

3、可能用到的场景举例

关于库存的仪表盘统计

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

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

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

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多