最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
SpringBoot业务策略模式多实现类注入过程:Map注入
时间:2026-06-10 08:40:00 编辑:袖梨 来源:一聚教程网
前言
在业务处理的过程中遇见一个场景,登录分A,B,C,他们都是对应的实现都是增删改查,但是不同的类型对应不同的平台登录方式,同时对应的增删改查业务逻辑有存在差异,这个时候如果不想办法设计代码就会出现A,B,C三种类型都要写一个对应接口(XXXserver),然后分别再去实现他们(XXXserverImpl),如果后来再增加一个平台登录,我们又要去重复相关接口和实现,不仅显得代码冗余,更是不好维护和管理,所以利用设计模式---策略模式就解决了这个问题。
策略模式的引入
一个接口有多个实现
public interface LoginService {
String passwordSalt = "test";
/**
* @param postAccessToken 请求体
*/
ExecResult<String> prop(Login postAccessToken);
/**
* 是否支持特定业务信息的处理
*
* @return
*/
Boolean isSupported(Login postAccessToken);
}
//实现一
@Slf4j
@Service
public class DingdingServiceImpl implements LoginService {
@Override
public ExecResult<String> prop(Login postAccessToken) {
System.out.println("钉钉用户");
return ExecResultUtil.success(JwtUtil.build());
}
@Override
public Boolean isSupported(Login postAccessToken) {
return Objects.equals(GrantTypeEnum.DINGDING.getCode(), postAccessToken.getGrantType());
}
}
//实现二
@Service
public class PasswordLoginServiceImpl implements LoginService {
@Autowired
private UserAccountService userAccountService;
@Override
public ExecResult<String> prop(Login postAccessToken) {
System.out.println("普通用户");
return ExecResultUtil.success(JwtUtil.build());
}
@Override
public Boolean isSupported(Login postAccessToken) {
return Objects.equals(GrantTypeEnum.PASSWORD.getCode(), postAccessToken.getGrantType());
}
}
//实现三
@Service
public class SysPasswordLoginServiceImpl implements LoginService {
@Autowired
private UserAccountService userAccountService;
@Override
public ExecResult<String> prop(Login postAccessToken) {
System.out.println("系统用户");
return ExecResultUtil.success(JwtUtil.build());
}
@Override
public Boolean isSupported(Login postAccessToken) {
return Objects.equals(GrantTypeEnum.SYS_PASSWORD.getCode(), postAccessToken.getGrantType());
}
}
枚举类型
@AllArgsConstructor
public enum GrantTypeEnum {
PASSWORD("password", "普通用户密码"),
PHONE("phone", "普通手机验证码"),
WE_CHAT("wechat", "普通微信"),
DINGDING("dingding", "普通钉钉"),
SYS_PASSWORD("sys_password", "系统用户密码"),
SYS_PHONE("sys_phone", "系统手机验证码"),
SYS_WE_CHAT("sys_wechat", "系统微信"),
SYS_DINGDING("sys_dingding", "系统钉钉"),
;
private String code;
private String message;
public String getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}}
写一个公共的类来判断获取对应的实现类
@Service
public class LoginServiceImpl {
//关键在这个,原理:当一个接口有多个实现类的时候,key为实现类名,value为实现类对象
private Map<String, LoginService> procMap = new ConcurrentHashMap<>();
@Autowired(required = false)//这个注入了多个实现类对象
private List<LoginService> procList = Collections.emptyList();
public ExecResult<String> prop(Login login) {
LoginService proc = getProc(login);
if (null == proc) {
throw new RuntimeException("no grant type:" + login.getGrantType());
}
return proc.prop(login);
}
private LoginService getProc(Login grantType) {
LoginService querier = procMap.get(grantType.getGrantType());
if (querier != null) {
return querier;
}
for (LoginService item : procList) {
if (item.isSupported(grantType)) {
querier = item;
procMap.put(grantType.getGrantType(), querier);
return querier;
}
}
return null;
}
}
控制层(为了测试用,根据业务使用,不一定用在控制层哈)
@Autowired
private LoginServiceImpl loginService;
@ApiOperation(value = "登录")
@PostMapping("/login")
public ExecResult<String> postAccessToken(@RequestBody Login login) {
return loginService.prop(login);
}
测试

完结撒花 !!!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
您可能感兴趣的文章:- SpringBoot测试类注入Bean失败的原因及分析
- SpringBoot顶层接口实现类注入项目的方法示例
- Springboot中如何通过yml为实体类注入属性
- SpringBoot Test类注入失败的解决
相关文章
- 国家电网认可的电力专科学校 - 2026年权威院校推荐 06-13
- 网络暴力成因与应对策略 - 键盘侠行为心理解析 06-13
- 成人自考报名官网入口 - 2026年最新登录通道 06-13
- 午时花的养殖方法与注意事项 - 2026年新手养护指南 06-13
- 暴花户是什么意思 - 网络流行语解析 06-13
- 小米MIX 3全面评测与使用体验 - 2026最新深度解析 06-13