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复用。

相关推荐
慧一居士11 分钟前
Mybatis Plus中 LambdaQueryWrapper、QueryWrapper 区别对比
spring boot
干到60岁退休的码农12 分钟前
13.构建登录接口响应数据
java·spring boot·mybatis
水巷石子20 分钟前
学习langChain4j的第二天,体验springBoot中的starter
java·spring boot·学习·spring·langchain4j
摇滚侠37 分钟前
《Spring Boot 3:高级与架构设计》第 1 章 BeanDefinitionRegistry 阅读笔记 3
spring boot·笔记·后端
zhougl99640 分钟前
Dockerfile实战教程
java·开发语言·spring boot
计算机毕设定制辅导-无忧学长1 小时前
《基于Spring Boot传承之光非遗陶瓷烧造产品交易平台的设计与实现》
java·vue.js·spring boot·后端·毕业设计
计算机学姐1 小时前
基于SpringBoot的旅游系统的设计与实现
java·vue.js·spring boot·后端·spring·java-ee·旅游
卷心菜的学习路1 小时前
Spring Boot 多数据源落地:AbstractRoutingDataSource + 注解切面(附源码)
java·spring boot·后端
武哥聊编程2 小时前
【AI实战项目】基于SpringAI+Springboot+Vue的AI智能简历优化助手
vue.js·人工智能·spring boot
卓怡学长3 小时前
w157基于springboot北部湾地区助农平台
java·spring boot·spring·maven·intellij-idea