欢迎光临
我们一直在努力

【码动四季】SpringBoot 微服务开发——我用 AtomCode 管编码规范的实战记录

摘要:SpringBoot 微服务项目最头疼的问题不是业务逻辑怎么写,而是团队编码规范统一、API 接口风格一致、CRUD 模板代码反复写。50 多篇文章的 SpringBoot 专栏背后,AtomCode 帮我管住了接口命名、异常处理、配置加密等 12 项编码约束。本文记录 AtomCode 在 SpringBoot 微服务开发中的 4 个真实使用场景,包含 Rules 配置、自定义 Skill 开发和 4 个踩坑案例。

阅读预估时间: 15 分钟

1. 场景:SpringBoot 项目编码规范管不住

问题爆发

2025 年下半年,团队在做一个电商中台微服务改造,分 5 个小组并行开发。第三个月做 code review 时发现问题集中爆发了:

  • 接口命名不统一:有的组用 /api/v1/order/create,有的组用 /api/v1/order/addOrder,还有的用 /order/save
  • 异常处理风格各异:有的组抛 BusinessException,有的组直接返回 ResponseEntity<String>,还有的组在 Controller 里 try-catch 完就吞掉
  • 配置管理一盘散沙:数据库密码明文写在 yml 里,Redis 配置每个组各写一套
  • DTO/VO 混用:同一个对象在 Controller、Service、Repository 三层之间传来传去,分不清哪些字段是给前端看的

这些问题持续了 2 个迭代后,技术负责人拉了一次复盘会,结论是:必须统一规范,但靠人肉 review 盯不过来。

为什么选择 AtomCode

之前试过 Alibaba Java Coding Guidelines 插件做静态检查,但自定义规则门槛高。试过 ArchUnit 写架构测试,但维护成本也不低。

2026 年初开始用 AtomCode 管理博客知识库时,我发现它的 Rules 机制恰好能解决这个问题——把编码规范写成结构化规则文件,写代码时自动加载。


2. SpringBoot 编码规范配置实战

#mermaid-svg-Kr3O1hpHN4SDdE2D{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Kr3O1hpHN4SDdE2D .error-icon{fill:#552222;}#mermaid-svg-Kr3O1hpHN4SDdE2D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Kr3O1hpHN4SDdE2D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .marker.cross{stroke:#333333;}#mermaid-svg-Kr3O1hpHN4SDdE2D svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Kr3O1hpHN4SDdE2D p{margin:0;}#mermaid-svg-Kr3O1hpHN4SDdE2D .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .cluster-label text{fill:#333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .cluster-label span{color:#333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .cluster-label span p{background-color:transparent;}#mermaid-svg-Kr3O1hpHN4SDdE2D .label text,#mermaid-svg-Kr3O1hpHN4SDdE2D span{fill:#333;color:#333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .node rect,#mermaid-svg-Kr3O1hpHN4SDdE2D .node circle,#mermaid-svg-Kr3O1hpHN4SDdE2D .node ellipse,#mermaid-svg-Kr3O1hpHN4SDdE2D .node polygon,#mermaid-svg-Kr3O1hpHN4SDdE2D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Kr3O1hpHN4SDdE2D .rough-node .label text,#mermaid-svg-Kr3O1hpHN4SDdE2D .node .label text,#mermaid-svg-Kr3O1hpHN4SDdE2D .image-shape .label,#mermaid-svg-Kr3O1hpHN4SDdE2D .icon-shape .label{text-anchor:middle;}#mermaid-svg-Kr3O1hpHN4SDdE2D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Kr3O1hpHN4SDdE2D .rough-node .label,#mermaid-svg-Kr3O1hpHN4SDdE2D .node .label,#mermaid-svg-Kr3O1hpHN4SDdE2D .image-shape .label,#mermaid-svg-Kr3O1hpHN4SDdE2D .icon-shape .label{text-align:center;}#mermaid-svg-Kr3O1hpHN4SDdE2D .node.clickable{cursor:pointer;}#mermaid-svg-Kr3O1hpHN4SDdE2D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .arrowheadPath{fill:#333333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Kr3O1hpHN4SDdE2D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kr3O1hpHN4SDdE2D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Kr3O1hpHN4SDdE2D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kr3O1hpHN4SDdE2D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Kr3O1hpHN4SDdE2D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Kr3O1hpHN4SDdE2D .cluster text{fill:#333;}#mermaid-svg-Kr3O1hpHN4SDdE2D .cluster span{color:#333;}#mermaid-svg-Kr3O1hpHN4SDdE2D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Kr3O1hpHN4SDdE2D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Kr3O1hpHN4SDdE2D rect.text{fill:none;stroke-width:0;}#mermaid-svg-Kr3O1hpHN4SDdE2D .icon-shape,#mermaid-svg-Kr3O1hpHN4SDdE2D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kr3O1hpHN4SDdE2D .icon-shape p,#mermaid-svg-Kr3O1hpHN4SDdE2D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Kr3O1hpHN4SDdE2D .icon-shape .label rect,#mermaid-svg-Kr3O1hpHN4SDdE2D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kr3O1hpHN4SDdE2D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Kr3O1hpHN4SDdE2D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Kr3O1hpHN4SDdE2D :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

Agents 层(自动化编排)

Skills 层(主动能力)

Rules 层(被动约束)

API 命名规则

异常处理规则

配置安全规则

生成 Controller 模板

生成异常处理代码

检查配置安全

代码生成 Agent

安全检查 Agent

质量审查 Agent

2.1 API 接口命名规则

# .atomcode/rules/springboot/api-naming-rule.md

# SpringBoot API 命名规范

– RESTful 资源命名统一用复数名词:/api/v1/orders, /api/v1/users
– 避免在 URL 中使用动词:用 POST /orders 而不是 /orders/create
– 路径一律小写,单词间用连字符:/order-items 而不是 /orderItems
– 版本号放在路径前缀:/api/v1/… 而不是 /api/…

# CRUD 映射规范

– GET /resource -> 查询列表
– GET /resource/{id} -> 查询详情
– POST /resource -> 创建
– PUT /resource/{id} -> 全量更新
– PATCH /resource/{id} -> 部分更新
– DELETE /resource/{id} -> 删除

# 参数规范

– 查询参数用 @RequestParam,路径变量用 @PathVariable
– 分页参数统一:page, size, sort
– 时间参数统一 ISO 8601 格式

配置这个规则后,每次 AtomCode 生成 Controller 代码时,都会自动遵循上述规范。对比效果:

指标规则前规则后改善
code review 打回率 35% 8% ⬇️ 77%
接口文档错误 12 次/月 2 次/月 ⬇️ 83%
新人上手时间 3 天 1 天 ⬇️ 67%

2.2 统一异常处理 Skill

# .atomcode/skills/springboot-exception-handler/SKILL.md

# SpringBoot 统一异常处理 Skill

## 生成内容

当需要生成异常处理代码时,按以下结构输出:

### 1. 异常类分层

– BusinessException(业务异常,含 errorCode + message)
– SystemException(系统异常,含 throwable 链)
– ValidationException(参数校验异常)

### 2. 全局异常处理器

– @RestControllerAdvice 统一拦截
– 按异常类型分级处理
– 统一返回格式:{code, message, data, traceId}

### 3. 错误码枚举

– 前缀标识模块:ORDER_001, USER_002
– HTTP 状态码映射
– 国际化消息模板

### 生成模板

```java
// 标准 Controller 代码结构
@RestController
@RequestMapping("/api/v1/${resource}")
@RequiredArgsConstructor
public class ${Resource}Controller {

private final ${Resource}Service service;

@GetMapping
public ApiResponse<List<${Resource}VO>> list(
@RequestParam(required = false) ${QueryParam} query,
@PageableDefault Pageable pageable) {
PageResult<${Resource}VO> result = service.pageQuery(query, pageable);
return ApiResponse.success(result);
}

@PostMapping
public ApiResponse<${Resource}VO> create(
@Valid @RequestBody ${Resource}CreateRequest request) {
${Resource}VO result = service.create(request);
return ApiResponse.success(result);
}

// … 其他 CRUD 方法遵循相同模式
}

这个 Skill 上线后,一个新模块的 Controller + 异常处理代码从手写 30 分钟降到 5 分钟,且风格完全统一。

2.3 配置安全检查 Agent

# .atomcode/agents/springboot-config-check.yaml
name: SpringBoot 配置安全检查
steps:
– skill: code–verifier
params:
check_type: security
rules:
– 检查 application.yml/properties 中是否有明文密码
– 检查是否配置了 Jasypt 加密
– 检查 Actuator 端点是否暴露敏感信息
– 检查数据库连接字符串是否使用环境变量
– skill: quality–inspector
params:
check_springboot_config: true

这个 Agent 帮我抓出过 3 次密码明文提交到 Git 仓库的问题,事后想想挺后怕的。

Why 这张图:引入 AtomCode 前后,Code Review 从"人肉通读"变成了"规则自动拦截+人工抽查",流程从串行阻塞变为并行高效。下图对比了两种模式的核心差异。

#mermaid-svg-5aSHgpFRK3CHEDHb{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5aSHgpFRK3CHEDHb .error-icon{fill:#552222;}#mermaid-svg-5aSHgpFRK3CHEDHb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5aSHgpFRK3CHEDHb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5aSHgpFRK3CHEDHb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5aSHgpFRK3CHEDHb .marker.cross{stroke:#333333;}#mermaid-svg-5aSHgpFRK3CHEDHb svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5aSHgpFRK3CHEDHb p{margin:0;}#mermaid-svg-5aSHgpFRK3CHEDHb .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-5aSHgpFRK3CHEDHb .cluster-label text{fill:#333;}#mermaid-svg-5aSHgpFRK3CHEDHb .cluster-label span{color:#333;}#mermaid-svg-5aSHgpFRK3CHEDHb .cluster-label span p{background-color:transparent;}#mermaid-svg-5aSHgpFRK3CHEDHb .label text,#mermaid-svg-5aSHgpFRK3CHEDHb span{fill:#333;color:#333;}#mermaid-svg-5aSHgpFRK3CHEDHb .node rect,#mermaid-svg-5aSHgpFRK3CHEDHb .node circle,#mermaid-svg-5aSHgpFRK3CHEDHb .node ellipse,#mermaid-svg-5aSHgpFRK3CHEDHb .node polygon,#mermaid-svg-5aSHgpFRK3CHEDHb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5aSHgpFRK3CHEDHb .rough-node .label text,#mermaid-svg-5aSHgpFRK3CHEDHb .node .label text,#mermaid-svg-5aSHgpFRK3CHEDHb .image-shape .label,#mermaid-svg-5aSHgpFRK3CHEDHb .icon-shape .label{text-anchor:middle;}#mermaid-svg-5aSHgpFRK3CHEDHb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5aSHgpFRK3CHEDHb .rough-node .label,#mermaid-svg-5aSHgpFRK3CHEDHb .node .label,#mermaid-svg-5aSHgpFRK3CHEDHb .image-shape .label,#mermaid-svg-5aSHgpFRK3CHEDHb .icon-shape .label{text-align:center;}#mermaid-svg-5aSHgpFRK3CHEDHb .node.clickable{cursor:pointer;}#mermaid-svg-5aSHgpFRK3CHEDHb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5aSHgpFRK3CHEDHb .arrowheadPath{fill:#333333;}#mermaid-svg-5aSHgpFRK3CHEDHb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5aSHgpFRK3CHEDHb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5aSHgpFRK3CHEDHb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5aSHgpFRK3CHEDHb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5aSHgpFRK3CHEDHb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5aSHgpFRK3CHEDHb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5aSHgpFRK3CHEDHb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5aSHgpFRK3CHEDHb .cluster text{fill:#333;}#mermaid-svg-5aSHgpFRK3CHEDHb .cluster span{color:#333;}#mermaid-svg-5aSHgpFRK3CHEDHb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5aSHgpFRK3CHEDHb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5aSHgpFRK3CHEDHb rect.text{fill:none;stroke-width:0;}#mermaid-svg-5aSHgpFRK3CHEDHb .icon-shape,#mermaid-svg-5aSHgpFRK3CHEDHb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5aSHgpFRK3CHEDHb .icon-shape p,#mermaid-svg-5aSHgpFRK3CHEDHb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5aSHgpFRK3CHEDHb .icon-shape .label rect,#mermaid-svg-5aSHgpFRK3CHEDHb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5aSHgpFRK3CHEDHb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5aSHgpFRK3CHEDHb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5aSHgpFRK3CHEDHb :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

效率提升 4x

引入 AtomCode 之后

否

是

是

否

开发者提交代码

AtomCode 自动检查

规则校验通过?

自动拦截 + 修改建议

人工抽查 20% 关键逻辑

需要调整?

反馈修改

合并

引入 AtomCode 之前

是

否

开发者提交代码

人工逐行 Review

发现问题?

打回修改

合并


3. Maven 依赖管理的实用配置

写 SpringBoot 最烦的就是 Maven 依赖冲突。在项目里建了以下规则:

# .atomcode/rules/springboot/maven-dependency-rule.md

# Maven 依赖管理规则

## 版本管理

– 统一在 <dependencyManagement> 中声明版本号
– 使用 properties 标签管理版本变量
– spring-boot-starter-parent 作为顶层 BOM

## 常见冲突处理

– Slf4j + Logback: 排除 commons-logging,防止冲突
– Guava: 统一版本号,避免多个版本共存
– Jackson: 使用 SpringBoot 自动管理的版本

## 依赖检查命令

```bash
mvn dependency:tree -Dverbose > dep-tree.txt
mvn dependency:analyze
mvn versions:display-dependency-updates

配合阿里云 Maven 镜像配置的 Rule,新项目首次构建从 30 分钟降到 3 分钟。


4. 踩坑记录

坑 1:规则写太死,灵活性不足

一开始把 API 命名规则写得很死——所有 POST 必须是"创建",不允许有"批量操作"等特殊场景。结果有个订单批量审核的接口,按规则只能是 POST /orders/audit,但语义上应该是 PATCH。

解决:在规则里加了"特殊场景可偏离,但需在方法上标注 @ApiOperation 解释原因"。Rule 不是铁律,是约定。

坑 2:Skill 模板里的变量名冲突

异常处理 Skill 里的 ${resource} 变量,在同时生成多个资源时互相覆盖。排查了 20 分钟才发现是模板变量作用域问题。

解决:Skill 模板改用 ${entityName} 加后缀 ${entityName}Controller、${entityName}Service,避免重名。

坑 3:Agent 检查频率太高,影响开发流

配置安全检查 Agent 设成每次保存文件都运行,结果编辑 yml 文件时一直弹检查结果,开发节奏被打断。

解决:改用 git commit 前触发,配合 husky + lint-staged 做 pre-commit hook。

坑 4:多人协作时 Rule 版本冲突

两个组各自改了 Rule 文件,合并时直接冲突。没有冲突解决流程,导致 Rule 规则临时失效了 2 天。

解决:Rule 也走 code review 流程,重大修改发群通知。小修改走 PR 合并。


Why 这张图:文中涉及了 12 项编码规范,覆盖 API 设计、异常处理、配置安全、Maven 依赖、日志规范、DTO/VO 分层、事务控制、缓存策略、定时任务、接口文档、单元测试、Git 提交规范。下图用思维导图展示这 12 项的覆盖层级和相互关系。

#mermaid-svg-zjFQLQSd83PUQaJC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zjFQLQSd83PUQaJC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zjFQLQSd83PUQaJC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zjFQLQSd83PUQaJC .error-icon{fill:#552222;}#mermaid-svg-zjFQLQSd83PUQaJC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zjFQLQSd83PUQaJC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zjFQLQSd83PUQaJC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zjFQLQSd83PUQaJC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zjFQLQSd83PUQaJC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zjFQLQSd83PUQaJC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zjFQLQSd83PUQaJC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zjFQLQSd83PUQaJC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zjFQLQSd83PUQaJC .marker.cross{stroke:#333333;}#mermaid-svg-zjFQLQSd83PUQaJC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zjFQLQSd83PUQaJC p{margin:0;}#mermaid-svg-zjFQLQSd83PUQaJC .edge{stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .section–1 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section–1 path,#mermaid-svg-zjFQLQSd83PUQaJC .section–1 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section–1 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section–1 text{fill:#ffffff;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth–1{stroke-width:17;}#mermaid-svg-zjFQLQSd83PUQaJC .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-0 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-0 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-0 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-0 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-0 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-0{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-0{stroke-width:14;}#mermaid-svg-zjFQLQSd83PUQaJC .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-1 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-1 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-1 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-1 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-1 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-1{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-1{stroke-width:11;}#mermaid-svg-zjFQLQSd83PUQaJC .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-2 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-2 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-2 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-2 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-2 text{fill:#ffffff;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-2{stroke-width:8;}#mermaid-svg-zjFQLQSd83PUQaJC .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-3 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-3 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-3 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-3 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-3 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-3{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-3{stroke-width:5;}#mermaid-svg-zjFQLQSd83PUQaJC .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-4 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-4 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-4 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-4 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-4 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-4{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-4{stroke-width:2;}#mermaid-svg-zjFQLQSd83PUQaJC .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-5 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-5 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-5 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-5 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-5 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-5{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-5{stroke-width:-1;}#mermaid-svg-zjFQLQSd83PUQaJC .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-6 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-6 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-6 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-6 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-6 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-6{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-6{stroke-width:-4;}#mermaid-svg-zjFQLQSd83PUQaJC .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-7 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-7 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-7 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-7 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-7 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-7{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-7{stroke-width:-7;}#mermaid-svg-zjFQLQSd83PUQaJC .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-8 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-8 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-8 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-8 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-8 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-8{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-8{stroke-width:-10;}#mermaid-svg-zjFQLQSd83PUQaJC .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-9 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-9 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-9 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-9 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-9 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-9{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-9{stroke-width:-13;}#mermaid-svg-zjFQLQSd83PUQaJC .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-10 rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-10 path,#mermaid-svg-zjFQLQSd83PUQaJC .section-10 circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-10 polygon,#mermaid-svg-zjFQLQSd83PUQaJC .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-10 text{fill:black;}#mermaid-svg-zjFQLQSd83PUQaJC .node-icon-10{font-size:40px;color:black;}#mermaid-svg-zjFQLQSd83PUQaJC .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .edge-depth-10{stroke-width:-16;}#mermaid-svg-zjFQLQSd83PUQaJC .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled,#mermaid-svg-zjFQLQSd83PUQaJC .disabled circle,#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:lightgray;}#mermaid-svg-zjFQLQSd83PUQaJC .disabled text{fill:#efefef;}#mermaid-svg-zjFQLQSd83PUQaJC .section-root rect,#mermaid-svg-zjFQLQSd83PUQaJC .section-root path,#mermaid-svg-zjFQLQSd83PUQaJC .section-root circle,#mermaid-svg-zjFQLQSd83PUQaJC .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-zjFQLQSd83PUQaJC .section-root text{fill:#ffffff;}#mermaid-svg-zjFQLQSd83PUQaJC .section-root span{color:#ffffff;}#mermaid-svg-zjFQLQSd83PUQaJC .section-2 span{color:#ffffff;}#mermaid-svg-zjFQLQSd83PUQaJC .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-zjFQLQSd83PUQaJC .edge{fill:none;}#mermaid-svg-zjFQLQSd83PUQaJC .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-zjFQLQSd83PUQaJC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

SpringBoot 编码规范12 项全覆盖

接口设计层

API 命名规则

RESTful CRUD 映射

DTO/VO 分层

安全与配置层

配置加密安全

Actuator 端点保护

环境变量管理

质量与工程层

Maven 依赖管理

统一异常处理

日志规范 AOP

事务控制策略

缓存策略标准

交付与协作层

接口文档同步

单元测试覆盖

Git 提交规范


5. 总结

使用效果(3 个月数据):

– code review 打回率从 35% -> 8%
– 接口文档错误从 12 -> 2 次/月
– 新人上手时间从 3 天 -> 1 天
– 配置安全问题从 3 次/月 -> 0 次

性价比最高的是 API 命名规则和异常处理 Skill,
投入 2 小时就能立竿见影。

如果你也在管 SpringBoot 微服务项目,建议从 API 命名规则开始,花 1 小时写好 Rule,后面省的不止 100 小时。


文中数据和案例来源于真实 SpringBoot 项目开发经验,AtomCode 版本为 v4.x。
时效说明:本文基于 AtomCode v4.x 版本编写,SpringBoot 和 Maven 版本请以实际使用版本为准,配置示例可能因版本更新有所变化。

赞(0)
未经允许不得转载:171主机测评 » 【码动四季】SpringBoot 微服务开发——我用 AtomCode 管编码规范的实战记录
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址