Java-SpringBoot-使用多态给项目解耦

提及

今天在打算维护一下智慧社区这个项目的时候,想到项目是使用Satoken这个开箱即用的授权和认证的组件,因为在项目开启的时候对SpringSecurity并不熟悉,而Satoken类似傻瓜式的,导入依赖进去,配置一下获取权限和角色的方法即可使用。

但是由此带来的问题就是,项目中充斥着Satoken的API方法,类似于StpUtil.isLogin(),StpUtil.getLoginIdAsLong()这类方法在Service层中已经是相当常见了,尽管是非常的方便,但是带来的问题就是假如后面我要替换另外一款权限认证和授权的组件,那么这些API方法通通都需要进行修改,这种强耦合很明显是不合理的。

我突然想到在SpringSecurity中,配置密码加密方法的时候,我们可以选择任意的密码加密方法。

@Bean
public PasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder();
}

那么,我能不能也像这样子,提供一个统一的接口,通过选择实现方式的不同,从而达到当需要更换别的实现的时候,只需要更改该处代码即可

多态

其实这需要利用到Java的三大特性之一,多态。Java的三大特性分别是封装,继承和多态

这里使用一个小例子来演示一下什么是多态。

我们先创建一个接口,这个接口只需要含有我们统一所需的方法。

/**
* @Author: Alickx
* @Date: 2022/06/12/16:22
* @Description: 统一接口
*/
public interface IRun {
/**
* 跑步
*/
void run();
}

然后我们需要来创建几个实现该接口的实现类

分别是Man.java和Woman.java

/**
* @Author: Alickx
* @Date: 2022/06/12/16:27
* @Description: 男人的实现类
*/
public class Man implements IRun{
@Override
public void run() {
System.out.println("我是Man,我在run");
}
}

/**
* @Author: Alickx
* @Date: 2022/06/12/16:27
* @Description: 女人的实现类
*/
public class Woman implements IRun{
@Override
public void run() {
System.out.println("我是Woman,我在run");
}
}

接着上面的提及,我们把Man和Woman想成是不同密码加密方式,而run方法则是他们都需要实现的密码加密方法

那我们试着来让这几个类实例化。

/**
* @Author: Alickx
* @Date: 2022/06/12/9:13
* @Description: main方法
*/
public class Demo8 {
public static void main(String[] args) {
// 使用man来实例化
IRun human1 = new Man();
human1.run();
// 使用woman来实例化
IRun human2 = new Woman();
human2.run();
}
}

这里可以看出假如我们要将Man所实现的run要替换成Woman,我们并不需要修改很多代码,只需要将IRun human1 = new Man(); 替换成IRun human1 = new Woman(); 即可

实际项目改造

那使用多态这种特性,我们就可以创建一个统一的接口,业务代码都使用这个接口的方法,而通过实现该接口方法,从而可以选择多种不同的实现方式。

那先创建一个AuthService接口,接口里面包含着我们业务代码所需要的api方法。

然后创建AuthSatokenServiceImpl 实现类,该实现类是使用Satoken来实现接口里面的方法。

简单调用一下Satoken的Api方法。

那么接口有了,实现类有了,但是在Springboot项目中,我们将实例化交给了Spring来管理,所以还需要创建一个配置类,来让Spring选择需要实例化的类。

Ok,那我们直接修改项目中的代码,这里举例一处。

原先的业务代码。

想以上红圈内的代码,我们需要获取当前请求的用户是否登录了,假如我们直接使用Satoken的API方法,那么后面需要更换SpringSecurity或者其他一些组件的时候,就需要大面积的修改这些代码。

改造后:

先注入实现类

@Autowired
AuthService authService;

这样子就完成了解耦,假如需要更换其他的授权认证组件,只需要创建一个实现AuthService接口的实现类,然后修改一下配置类的实例即可


更改该处即可,即可更换。

Java-SpringBoot-使用多态给项目解耦的更多相关文章

  1. springboot成神之——springboot+mybatis+mysql搭建项目简明demo

    springboot+mybatis+mysql搭建项目简明demo 项目所需目录结构 pom.xml文件配置 application.properties文件配置 MyApplication.jav ...

  2. 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案

    JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 本文为转载,原文地址为:https://www.cnblogs.com/adversary/p/103 ...

  3. JAVA - SpringBoot项目跨域访问

    JAVA - SpringBoot添加支持CORS跨域访问 CORS(Cross-Origin Resource Sharing)“跨域资源共享”,是一个W3C标准,它允许浏览器向跨域服务器发送Aja ...

  4. JAVA - SpringBoot项目引用MyBatis操作数据库

    JAVA - SpringBoot项目引用MyBatis操作数据库 1. 创建SpringBoot项目,参考:https://www.cnblogs.com/1285026182YUAN/p/1232 ...

  5. JAVA - SpringBoot项目引用generator生成 Mybatis文件

    JAVA - SpringBoot项目引用generator生成 Mybatis文件  在spring官网https://start.spring.io/自动生成springboot项目,这里选择项目 ...

  6. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

  7. java~springboot~目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot~目录索引 Java~关于开发工具和包包 Java ...

  8. 使用idea+springboot+Mybatis搭建web项目

    使用idea+springboot+Mybatis搭建web项目 springboot的优势之一就是快速搭建项目,省去了自己导入jar包和配置xml的时间,使用非常方便. 1.创建项目project, ...

  9. 【Other】最近在研究的, Java/Springboot/RPC/JPA等

    我的Springboot框架,欢迎关注: https://github.com/junneyang/common-web-starter Dubbo-大波-服务化框架 dubbo_百度搜索 Dubbo ...

随机推荐

  1. 《头号玩家》AI电影调研报告(四)

    五. 现实中对于技术的实现 1.自由变身 电影中,主人公借助"魔幻眼镜"让自己快速变成另一个人的模样,现实中我们一样也能做到! 在今年游戏开发者大会(GDC)上,一个名为" ...

  2. 免费的天气API

    高德地图天气 天气查询-API文档 请求示例: { "status": "1", "count": "1", " ...

  3. Java学习day29

    线程礼让(yield):礼让线程,让当前正在执行的线程暂停,但是不阻塞:让线程从运行状态转为就绪状态:让CPU重新调度,礼让不一定成功 合并线程(join):待此线程执行完毕后,再执行其他线程,其他线 ...

  4. Vue实战-购物车案例

    Vue实战-购物车案例 普通购物车 实现的功能:添加商品到购物车,计算总价 <!DOCTYPE html> <html lang="en"> <hea ...

  5. Java语言学习day15--7月21日

    今日内容介绍1.Eclipse开发工具2.超市库存管理系统 ###01Eclipse的下载安装 * A: Eclipse的下载安装  * a: 下载 * http://www.eclipse.org ...

  6. 2021.08.06 P3478 STA-Station(树形结构)

    2021.08.06 P3478 STA-Station(树形结构) [P3478 POI2008]STA-Station - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 给 ...

  7. python基础练习题(题目 输出一个随机数。)

    day35 --------------------------------------------------------------- 实例050:随机数 题目 输出一个随机数. 分析:使用ran ...

  8. 手把手教会将 Windows 窗体桌面应用从.NET Framework迁移到 .NET SDK/.NET 6 格式

    接上篇:手把手教会 VS2022 设计 Winform 高DPI兼容程序 (net461 net6.0 双出) https://www.cnblogs.com/densen2014/p/1614293 ...

  9. react 可拖拽改变位置和大小的弹窗

    一 目标 最近,项目上需要一个可以弹出一个可以移动位置和改变大小的窗口,来显示一下对当前页面的一个辅助内容 二 思路 1.之前写过一个antd modal的可移动弹窗但是毕竟不如自己写的更定制化,比如 ...

  10. 苹果手机Safri浏览器 js 解析问题

    低系统版本的苹果手机的浏览器存在很多JS问题 一  date 问题 1.new Date()  {至少10.3版本已下存在这个问题} 苹果手机只能识别 new Date('2017/04/12') 这 ...