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

406 阅读1分钟

1. 前言

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

2. 解决方法

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

3. 代码

3.1 定义接口和实现

接口

package com.example.testspring.user.service;

public interface IUserService {
    String say();
}

实现A

@Service
public class AUserService implements IUserService {

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

实现B

@Service
public class BUserService implements IUserService {

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

实现C

@Service
public class BUserService implements IUserService {

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

3.2 定义 enum 枚举类

@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 调用


@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. 注入全部实现
@Autowired
private Map<String, IUserService> userServiceMap;
  1. 调用实现方法
String name = userDTO.getUserType().getServiceName(); 
IUserService userService = userServiceMap.get(name); 
String say = userService.say();

3.4 验证

image.png