SpringBoot 实战 不同参数调用不同实现

程序浅谈 后端 2025-02-28

SpringBoot 实战 不同参数调用不同实现

1. 前言

实际工作中,我们经常会遇到需要根据入参的不同,调用不同的实现。而如何优雅又严谨的实现这一需求呢?
严谨指的是限制用户输入的范围,避免用户输入不存在的实现名;
优雅指的是尽量不用 if...else..., 因为当需求变化,当前接口的实现越来越多,就会形成 if...else... 屎山般的代码,代码逻辑复杂难懂,看着就难受。

2. 解决方法

解决方法其实非常简单:map+enum 就可以实现 优雅又严谨
可以理解为工厂模式或者策略模式在springboot 框架的优雅实践。

3. 代码

3.1 定义接口和实现

接口java

代码解读
复制代码
package com.example.testspring.user.service; public interface IUserService { String say(); }

实现Ajava

代码解读
复制代码
@Service public class AUserService implements IUserService { @Override public String say() { return "this AA UserService"; } }

实现Bjava

代码解读
复制代码
@Service public class BUserService implements IUserService { @Override public String say() { return "this BB UserService"; } }

实现Cjava

代码解读
复制代码
@Service public class BUserService implements IUserService { @Override public String say() { return "this CC UserService"; } }

3.2 定义 enum 枚举类java

代码解读
复制代码
@AllArgsConstructor @Getter public enum UserTypeEnum { A_USER(100, AUserService.class.getSimpleName()), B_USER(200, BUserService.class.getSimpleName()), C_USER(200, CUserService.class.getSimpleName()); private final Integer code; private final String serviceName; }

3.3 调用java

代码解读
复制代码
@RestController @RequestMapping("/api/v1/user/index") public class IndexController { @Autowired private Map<String, IUserService> userServiceMap; @PostMapping("/hello") public Map<String, String> test(@RequestBody @Validated UserDTO userDTO) { try { String name = userDTO.getUserType().getServiceName(); IUserService userService = userServiceMap.get(name); String say = userService.say(); return new HashMap<String, String>() { { put("username", userDTO.getUsername()); put("phone", userDTO.getPhone().toString()); put("say", say); } }; } catch (Exception e) { System.out.println(e.getMessage()); } return new HashMap<>(); } }

特别关注两个地方:

  1. 注入全部实现java
代码解读
复制代码
@Autowired private Map<String, IUserService> userServiceMap;
  1. 调用实现方法java
代码解读
复制代码
String name = userDTO.getUserType().getServiceName(); IUserService userService = userServiceMap.get(name); String say = userService.say();

3.4 验证

转载来源:https://juejin.cn/post/7323271668990738442

Apipost 私有化火热进行中

评论