springboot项目service层整理

前言

最近看到网络上五花八门的后台管理系统的框架,我打算简单手搓一个属于自己的前后端框架。已经动工有一段时间了,后端使用的springboot+mybatis-plus。最开始service层的各个服务都是用的mybatisx自动生成的service。形如:

css 复制代码
|--service
   |--impl
      |--userServiceImpl
      |--roleServiceImpl
   |--userService
   |--roleService

这样的话,要实现userService的具体业务,比如对user进行role权限的校验,那就必须要向userService注入roleService。

如果项目小的话还好,项目一旦大起来,各种表之间的service互相注入,很容易就会造成循环依赖的问题,而且内部方法也是杂乱无章。

为了解决这个问题,我决定开始重构代码

重构方案

我将我的service内部再分层,分作了三层分层架构

css 复制代码
|--service
   |--basic
   |--domain
   |--facade

那么这三层架构各自具体负责什么,下面我们具体说明

basic - 基础服务层

basic层就是存放原本mybatisx生成的所有service,它的职责就是

  1. 提供最基础的CRUD操作
  2. 直接与数据访问层(Mapper)交互
  3. 实现单表的基本业务逻辑

并且,它不能注入别的basicService

domain - 领域服务层

domain用来实现具体的业务逻辑,可以任意注入组合basicService以实现复杂的业务。

我对domain层里具体的domainService有自己的一套划分和命名规则。我们以用户模块为例,我会将其划分为3个domainService:

css 复制代码
|--domain
   |--impl # 实现类
   |--UserQueryDomain      # 用户有关的查询业务逻辑
   |--UserOperationDomain  # 用户有关的操作业务逻辑
   |--UserValidationDomain # 用户有关的校验业务逻辑

facade - 门面服务层

facade层用以提供统一的对外服务接口,Controller层直接注入facade依赖就好,用以整合协调不同Domain的服务。包含操作权限的验证,业务流程的高层协调。具体我是直接以模块划分和命名的:

css 复制代码
|--facade
   |--impl # 实现类
   |--UserFacade # 用户模块门面
   |--RoleFacade # 角色模块门面

例如我有一个addUser方法,我在UserFacade中要先调用UserValidationDomain校验用户名是否已存在,再调用UserOperationDomain的添加用户。

总结

这样做,我们的service三层各司其职,修改基础功能也不会影响上层业务逻辑。

依赖因为有了方向性,所以也避免了循环依赖的问题。

rust 复制代码
facade -> domain -> basic

而且复用性提高了,Basic层可被多个Domain复用,Domain层可被多个Facade复用。

相关推荐
老华带你飞17 分钟前
校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园交友网站
超级小忍4 小时前
使用 GraalVM Native Image 将 Spring Boot 应用编译为跨平台原生镜像:完整指南
java·spring boot·后端
Warren986 小时前
Spring Boot 整合网易163邮箱发送邮件实现找回密码功能
数据库·vue.js·spring boot·redis·后端·python·spring
xiaogg36788 小时前
SpringBoot applicationContext.getBeansOfType获取某一接口所有实现类,应用于策略模式
java·spring boot·策略模式
Warren988 小时前
如何在 Spring Boot 中安全读取账号密码等
java·开发语言·spring boot·后端·安全·面试·测试用例
csdn_aspnet12 小时前
解决 Spring Boot 应用程序中的“无法配置数据源”错误
java·spring boot
至此流年莫相忘14 小时前
TypeReference 泛型的使用场景及具体使用流程
java·开发语言·spring boot
Warren9814 小时前
Spring Boot 拦截器返回中文乱码的解决方案(附全局优化思路)
java·网络·spring boot·redis·后端·junit·lua
练习时长一年15 小时前
SpringMVC相关自动配置
java·spring boot·后端