Java-SpringBoot-使用多态给项目解耦
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-使用多态给项目解耦的更多相关文章
- springboot成神之——springboot+mybatis+mysql搭建项目简明demo
springboot+mybatis+mysql搭建项目简明demo 项目所需目录结构 pom.xml文件配置 application.properties文件配置 MyApplication.jav ...
- 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案
JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 本文为转载,原文地址为:https://www.cnblogs.com/adversary/p/103 ...
- JAVA - SpringBoot项目跨域访问
JAVA - SpringBoot添加支持CORS跨域访问 CORS(Cross-Origin Resource Sharing)“跨域资源共享”,是一个W3C标准,它允许浏览器向跨域服务器发送Aja ...
- JAVA - SpringBoot项目引用MyBatis操作数据库
JAVA - SpringBoot项目引用MyBatis操作数据库 1. 创建SpringBoot项目,参考:https://www.cnblogs.com/1285026182YUAN/p/1232 ...
- JAVA - SpringBoot项目引用generator生成 Mybatis文件
JAVA - SpringBoot项目引用generator生成 Mybatis文件 在spring官网https://start.spring.io/自动生成springboot项目,这里选择项目 ...
- Java SpringBoot 项目构建 Docker 镜像调优实践
PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...
- java~springboot~目录索引
回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot~目录索引 Java~关于开发工具和包包 Java ...
- 使用idea+springboot+Mybatis搭建web项目
使用idea+springboot+Mybatis搭建web项目 springboot的优势之一就是快速搭建项目,省去了自己导入jar包和配置xml的时间,使用非常方便. 1.创建项目project, ...
- 【Other】最近在研究的, Java/Springboot/RPC/JPA等
我的Springboot框架,欢迎关注: https://github.com/junneyang/common-web-starter Dubbo-大波-服务化框架 dubbo_百度搜索 Dubbo ...
随机推荐
- FastAPI(六十八)实战开发《在线课程学习系统》接口开发--用户 个人信息接口开发
在之前的文章:FastAPI(六十七)实战开发<在线课程学习系统>接口开发--用户登陆接口开发,今天实战:用户 个人信息接口开发. 在开发个人信息接口的时候,我们要注意了,因为我们不一样的 ...
- XXE漏洞——介绍及利用
什么是xxe XML外部实体注入,简称XXE漏洞.XML文档结构包括XML声明,DTD文档类型定义,文档元素. XML示例 <?xml version="1.0"?>X ...
- Kubernetes探针原理详解
前言: 分布式系统和微服务体系结构的挑战之一是自动检测不正常的应用程序,并将请求(request)重新路由到其他可用系统,恢复损坏的组件.健康检查是应对该挑战的一种可靠方法.使用 Kubernetes ...
- 如何使用Android可视化埋点
Android可视化埋点是Android全埋点的增强.开发者可以将App界面同步至DTM界面,并在DTM界面通过可视化点击的方式添加埋点事件.目前Android可视化埋点包含两种埋点方式:普通可视化埋 ...
- .NET 6 史上最全攻略
欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...
- 硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
在Redis 缓存击穿(失效).缓存穿透.缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」. 码哥,布隆过滤器还能在哪些场景使用呀? 比如我们使用「码哥跳动」开发的「明日头条」APP 看 ...
- Java学习day31
同步方法的机制:synchronized,包括synchronized方法和synchronized块 同步方法:public synchronized void method(int args){ ...
- Linux ubuntu下docker容器安装和基础命令
Docker介绍: 云计算就好比大货轮,docker就是集装箱虚拟机虽然可以隔离出很多"子电脑",但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare). 而容器技术 ...
- 移动端屏幕适配(rem+js)
什么是移动端适配 在制作webapp时,一个很关键的问题就是适配各种机型不同屏幕的大小,让每种机型上的布局看起来都尽量一样. 也就是说用同一套代码在不同分辨率的手机上跑时,页面元素间的间距.留白,以及 ...
- ASP.NET Web 应用 Docker踩坑历程
听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...