前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >SpringBoot 实战 不同参数调用不同实现

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

作者头像
科技新语
发布2025-02-28 17:46:15
发布2025-02-28 17:46:15
5000
代码可运行
举报
运行总次数:0
代码可运行

1. 前言

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

2. 解决方法

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

3. 代码

3.1 定义接口和实现

接口

代码语言:javascript
代码运行次数:0
复制
java 代码解读复制代码package com.example.testspring.user.service;

public interface IUserService {
    String say();
}

实现A

代码语言:javascript
代码运行次数:0
复制
java 代码解读复制代码@Service
public class AUserService implements IUserService {

    @Override
    public String say() {
        return "this AA UserService";
    }
}

实现B

代码语言:javascript
代码运行次数:0
复制
java 代码解读复制代码@Service
public class BUserService implements IUserService {

    @Override
    public String say() {
        return "this BB UserService";
    }
}

实现C

代码语言:javascript
代码运行次数:0
复制
java 代码解读复制代码@Service
public class BUserService implements IUserService {

    @Override
    public String say() {
        return "this CC UserService";
    }
}

3.2 定义 enum 枚举类

代码语言:javascript
代码运行次数:0
复制
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 调用

代码语言:javascript
代码运行次数:0
复制
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. 注入全部实现
代码语言:javascript
代码运行次数:0
复制
java 代码解读复制代码@Autowired
private Map<String, IUserService> userServiceMap;
  1. 调用实现方法
代码语言:javascript
代码运行次数:0
复制
java 代码解读复制代码String name = userDTO.getUserType().getServiceName(); 
IUserService userService = userServiceMap.get(name); 
String say = userService.say();

3.4 验证

image.png
image.png

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. 解决方法
  • 3. 代码
    • 3.1 定义接口和实现
    • 3.2 定义 enum 枚举类
    • 3.3 调用
    • 3.4 验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档