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. 设置IDEA启动时不打开上次项目

    步骤 1.启动IDEA,点击File 2.点击setting,在Appearance&Behavior中找到System Setting 3.取消勾选Reopen projects on st ...

  2. Python 图_系列之基于<链接表>实现无向图最短路径搜索

    图的常用存储方式有 2 种: 邻接炬阵 链接表 邻接炬阵的优点和缺点都很明显.优点是简单.易理解,对于大部分图结构而言,都是稀疏的,使用炬阵存储空间浪费就较大. 链接表的存储相比较邻接炬阵,使用起来更 ...

  3. Java中List接口重要实现类一ArrayList

    1.java.util.ArrayList 集合数据存储的结构是数组结构.元素查找快,而增删就比较慢 所以如果要查询数据,遍历数据,ArrayList是最常用的集合 2.ArrayList是不同步的, ...

  4. AWS - Basic 1

    之前由于公司 Training 考取了 AWS-SAP 的证书,更多理解的是概念和理论上的知识,并未实操.但对于学习一门技术来说,实践是加深理解和掌握该技术的必经之路,强调知行合一.所以最近打算重新熟 ...

  5. GET sql注入

    靶机地址:192.168.43.156 攻击机地址:192.168.43.89 一.AppScan检查靶机sql漏洞 二.使用sqlmap利用SQL注入漏洞 1.sqlmap -u " ht ...

  6. C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解>最后列出了 Fil ...

  7. XGBoost文本分类,多分类、二分类、10-Fold(K-Fold)

    做机器学习的时候经常用到XGB,简单记录一下 K折交叉验证也是模型常用的优化方法.一起记录... K折交叉验证:类似三个臭皮匠,顶个诸葛亮.我的理解是,就是用民主投票的方式,选取票数最高的那个当结果. ...

  8. OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 刘鑫 容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法.在 ArkUI 开发框 ...

  9. 【ACM程序设计】差分

    差分 假设有一个数列,我们需要对数列中的一个区间加上或减去一个值,直接想到的便是对该区间进行一次循环逐项加减. 但是当请求的操作变得非常多的时候,每次请求都进行一次循环会很容易爆时间,因此我们引入了差 ...

  10. Pytorch Linear ()简单推导

    pytorch,nn.Linear 下图中的A是权重矩阵,b是偏置. in_features输入样本的张量大小 out_features输出样本的张量大小 bias是偏置 # 测试代码 # batch ...