当前位置:

首页 > 编程开发 > SpringBoot代码风格推荐

SpringBoot代码风格推荐

应用SpringBoot框架的项目按功能职责划分目录,包括控制层、服务层、持久层等。实体对象严格区分持久化对象、视图对象、数据传输对象和业务对象,避免耦合。工具类分为静态工具类、容器化工具类和业务专用辅助类。各层职责明确,提升可维护性。

本文目录

    整体包结构

    com.example.project
    │
    ├── bean                      # 实体类统一目录
    │   ├── entity                # 数据库实体
    │   ├── vo                    # 接口返回对象
    │   ├── dto                   # 接口接收参数
    │   ├── bo                    # 业务层聚合对象
    │   ├── doc                   # MongoDB 文档实体
    │   ├── cache                 # 缓存实体对象
    │   ├── index                 # ES 索引实体
    │   ├── message               # MQ 消息体
    │   └── event                 # Spring 事件对象
    ├── controller                # Web 接口层
    ├── service                   # 业务逻辑接口
    │   └── impl                  # 业务逻辑实现
    ├── mapper                    # 数据访问层
    ├── biz                       # 业务聚合处理
    ├── client                    # Feign 客户端
    ├── convert                   # 对象转换器
    ├── aspect                    # AOP 切面
    ├── config                    # 配置类
    ├── constant                  # 常量类
    ├── enums                     # 枚举类
    ├── exception                 # 自定义异常
    ├── util                      # 工具类目录(含 Util 和 Kit)
    └── job                       # 定时任务
        ├── XxxJob.ja va
        └── XxxHelper.ja va        # 辅助类,放在对应功能包内

    先说说整体包结构这件事。很多团队刚开始做项目时,包结构往往随手一搭,后续随着业务膨胀就变得难以维护。这里给出一个比较成熟的实践方案:按功能职责分层,而不是按技术框架分层。这样做的最大好处是,新成员拿到项目就能快速定位——看到“controller”知道是接口层,“service”是业务逻辑层,一目了然。

    值得注意的是,这个结构里特别区分了“bean”目录。很多新手会把所有实体类都塞在一个“model”或“pojo”包里,但实际项目中,数据库实体、接口返回对象、接口接收参数这些对象的变化频率和维度完全不同,混在一起只会让依赖关系变得混乱。分开管理是从源头上控制耦合。

    分层命名规范

    层级职责类名后缀包名说明
    Web 接口层​xxxController​​controller​接收请求、参数校验、返回 Vo
    Service 接口​xxxService​​service​业务逻辑接口定义
    Service 实现​xxxServiceImpl​​service.impl​业务逻辑实现,加事务注解
    数据访问层​xxxMapper​​mapper​MyBatis/MyBatis-Plus 映射接口
    业务聚合处理​xxxBiz​​biz​跨 Service 或外部调用的复杂业务编排
    远程服务客户端​xxxClient​​client​Feign 声明式 HTTP 客户端
    对象转换器​xxxConvert​​convert​统一处理对象转换
    AOP 切面​xxxAspect​​aspect​横切关注点(日志、权限、监控等)
    常量类​xxxConst​​constant​常量按业务拆分,不堆在一个类中
    枚举类​xxxEnum​​enums​统一管理枚举定义
    自定义异常​xxxException​​exception​业务异常或系统异常
    配置类​xxxConfig​​config​如 RedisConfig​、SwaggerConfig​
    定时任务​xxxJob​​job​定时调度任务类
    辅助类(业务/功能)​xxxHelper​对应功能包内如 job.JobHelper​、mail.MailHelper​

    分层命名的核心逻辑其实很清晰:每个类名后缀都代表了它的职责和生命周期。比如 Controller 只做请求转发和参数校验,不写业务逻辑;ServiceImpl 负责具体实现,但不直接操作数据库——通过 Mapper 接口做数据访问。这样拆开之后,每层的修改范围都被限定了,改动一个层不会波及到其他层。

    需要特别说明的是“Biz”层。很多时候业务逻辑并不是简单的 CRUD堆砌,而是要协调多个 Service 调用外部接口,这时候就应该用 Biz把这些编排逻辑收拢起来。很多团队把这个和 ServiceImpl混淆,结果ServiceImpl越来越臃肿,变成了大泥球。

    实体类命名规范

    业务实体

    对象类型类名后缀包路径说明
    数据库实体xxx / XxxPobean.entity / bean.po与数据库表结构一一对应
    接口返回对象xxxVobean.vo面向前端展示
    接口接收参数xxxDtobean.dto接收请求参数,可含校验注解
    业务层聚合对象xxxBobean.bo业务逻辑层内部使用
    MongoDB 文档实体xxxDocbean.docMongoDB 实体定义
    缓存实体对象xxxCachebean.cacheRedis/Caffeine 缓存结构
    ES 索引实体xxxIndexbean.indexElasticsearch 文档映射
    MQ 消息体xxxMessagebean.message队列/主题传输的消息体
    Spring 事件对象xxxEventbean.event领域事件或应用事件对象

    使用示例

    // 保存用户:接收 Dto,返回 Vo
    @PostMapping("/sa ve")
    public SysUserVo sa veUser(@RequestBody @Valid SysUserSa veDto dto) {
        SysUserPo po = userConvert.toPo(dto);
        userMapper.insert(po);
        return userConvert.toVo(po);
    }
    

    ❌ 不要将 Entity / Po 直接返回给前端

    SpringBoot代码风格推荐

    ✅ 各层对象严格隔离,降低变动影响面

    实体类这一块其实很容易踩坑。很多人嫌麻烦,直接把数据库实体(Po)返回给前端,省去了转换的步骤。这种做法在简单项目里看似高效,但随着需求迭代,你有天突然发现需要给某字段重命名,或者要隐藏一些敏感字段,改动就成了噩梦——因为前端、数据库、内部逻辑全绑在一个类上了。

    严格区分 Vo、Dto、Po、Bo 这几个对象类型,本质上是在不同边界处设置“防火墙”。即使每个实体多写几个转换方法,但长期来看收益远远大于成本。特别是用了 MapStruct 等转换工具后,代码量其实并没有增加多少。

    业务之外的实体

    对于独立于业务之外的实体,如工具类、框架配置等需要的对象,有两种常见处理方式:

    方式适用场景示例
    使用内部类仅被当前类使用、逻辑简单、内聚性强Controller 内部的请求/响应类、Service 内部的中间对象
    放在业务类一起与某个业务紧密相关,但不属于标准实体类型业务特有的参数封装、中间计算结果对象

    示例

    方式一:使用内部类(适用于仅当前类使用)

    @RestController
    public class UserController {
        
        @PostMapping("/login")
        public Result login(@RequestBody LoginRequest request) {
            // ...
        }
        
        // 内部类,仅用于当前 Controller
        static class LoginRequest {
            private String username;
            private String password;
        }
    }
    

    方式二:放在业务类一起(适用于业务特有对象)

    // 放在使用它的 Service 同包下,但不属于标准 bean 类型
    // service/OrderStatContext.ja va
    public class OrderStatContext {
        private Long userId;
        private LocalDateTime startTime;
        private LocalDateTime endTime;
        // 订单统计的中间计算对象
    }
    

    选择建议

    • 仅当前类使用 → 内部类
    • 业务特有但不属于标准 Entity/Vo/Dto/Bo → 放在对应业务包下

    这一部分可能容易产生分歧。对于非标准实体对象,有些人倾向于全部放在一个公共包里,但实际经验表明,紧耦合的业务对象放在业务包下更合理:当业务模块被重构或拆分时,这些对象可以跟着迁移,不会产生大的牵扯。

    工具类命名规范

    类型命名后缀包位置是否静态是否依赖容器说明
    静态工具类xxxUtilutil✅ 是❌ 否纯静态方法,无状态,不依赖 Spring
    容器化工具类xxxKitutil❌ 否✅ 是需要注入 Bean,加 @Component
    辅助类(业务/功能)xxxHelper对应功能包内❌ 否✅ 是业务或功能专用,如 job.JobHelper

    示例代码

    Util(静态调用)

    public class DateUtil {
        public static String format(LocalDateTime date, String pattern) {
            // 静态方法,不依赖 Spring
        }
    }
    // 使用
    String dateStr = DateUtil.format(now, "yyyy-MM-dd");
    

    Kit(注入使用,放在 util 包)

    @Component
    public class RedisKit {
        @Autowired
        private RedisTemplate redisTemplate;
        
        public Object get(String key) {
            return redisTemplate.opsForValue().get(key);
        }
    }
    // 使用
    @Service
    public class UserService {
        @Autowired
        private RedisKit redisKit;
    }
    

    Helper(功能专用,放在对应功能包内)

    // job/JobHelper.ja va
    @Component
    public class JobHelper {
        @Autowired
        private MailService mailService;
        
        public void sendAlert(String jobName, Exception e) {
            mailService.send("Job Alert", jobName + " 执行失败:" + e.getMessage());
        }
    }
    

    工具类的命名看起来是小细节,但实际影响代码的可读性和可维护性。很多项目里的工具类命名很随意,有的叫Utils,有的叫Tools,还有的干脆叫XxxHelper。这里给出明确区分逻辑:纯静态、不依赖Spring的用Util,需要注入容器的用Kit,功能专用的用Helper。区分清楚后,使用者看到类名就能判断它的使用方式,不需要阅读源码或文档。

    特别提醒一点:Kit 和 Helper 虽然都是注入使用,但 Kit 是通用的、跨业务的工具性组件(比如封装了对Redis的操作),而 Helper 是业务专用的辅助类(比如定时任务失败发送邮件的逻辑)。这个区别不只是概念上的,更体现在包位置和职责上——Kit放在全局的 util 包,Helper放在具体业务包内,避免通用层与业务层的依赖关系错乱。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景

    解析六个GitHub AI开源项目的具体用途,包括软件静态分析、智能体回答检查、多语言配音、求职材料生成、本地代码检索及动态歌词展示,帮助开发者根据实际需求筛选工具并正确验证结果。

    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    Visual Studio2022F5调试提示启动项目未配置怎么修复
    Visual Studio2022F5调试提示启动项目未配置怎么修复

    解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

    Visual Studio2022NuGet包还原失败离线处理方案
    Visual Studio2022NuGet包还原失败离线处理方案

    解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

    Visual Studio2017大项目加载缓慢,优化加载性能技巧
    Visual Studio2017大项目加载缓慢,优化加载性能技巧

    解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

    Visual Studio2022设置多启动项目同时调试运行
    Visual Studio2022设置多启动项目同时调试运行

    详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

    fastapi下载文件接口实现教程
    fastapi下载文件接口实现教程

    深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。