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

相关推荐
colicode4 分钟前
java短信接口开发对接全流程:Spring Boot项目集成短信功能详解
java·开发语言·spring boot
SamRol14 分钟前
达梦数据库指令 及 在Spring Boot + MyBatis-Plus上的使用
java·数据库·spring boot·mybatis·达梦·intellij idea
Hx_Ma1631 分钟前
SpringBoot多配置文件
spring boot
颇有几分姿色31 分钟前
Spring Boot Actuator未授权访问漏洞 【原理扫描】修复
java·spring boot·后端
1candobetter33 分钟前
JAVA后端开发——Spring Boot 多环境配置与实践
java·开发语言·spring boot
小北方城市网40 分钟前
Spring Boot Actuator+Prometheus+Grafana 生产级监控体系搭建
java·spring boot·python·rabbitmq·java-rabbitmq·grafana·prometheus
好好研究11 小时前
SpringBoot - yml配置文件
java·spring boot·spring
JH307314 小时前
SpringBoot自定义启动banner:给项目加个专属“开机画面”
java·spring boot·后端
猿小羽15 小时前
AI 学习与实战系列:Spring AI + MCP 深度实战——构建标准化、可扩展的智能 Agent 系统
java·spring boot·llm·agent·spring ai·mcp·model context protocol
Coder_Boy_17 小时前
基于SpringAI的在线考试系统-数据库设计核心业务方案
java·数据库·spring boot·ddd·tdd