SpringBoot 代碼風(fēng)格推薦
整體包結(jié)構(gòu)
com.example.project
│
├── bean # 實體類統(tǒng)一目錄
│ ├── entity # 數(shù)據(jù)庫實體
│ ├── vo # 接口返回對象
│ ├── dto # 接口接收參數(shù)
│ ├── bo # 業(yè)務(wù)層聚合對象
│ ├── doc # MongoDB 文檔實體
│ ├── cache # 緩存實體對象
│ ├── index # ES 索引實體
│ ├── message # MQ 消息體
│ └── event # Spring 事件對象
├── controller # Web 接口層
├── service # 業(yè)務(wù)邏輯接口
│ └── impl # 業(yè)務(wù)邏輯實現(xiàn)
├── mapper # 數(shù)據(jù)訪問層
├── biz # 業(yè)務(wù)聚合處理
├── client # Feign 客戶端
├── convert # 對象轉(zhuǎn)換器
├── aspect # AOP 切面
├── config # 配置類
├── constant # 常量類
├── enums # 枚舉類
├── exception # 自定義異常
├── util # 工具類目錄(含 Util 和 Kit)
└── job # 定時任務(wù)
├── XxxJob.java
└── XxxHelper.java # 輔助類,放在對應(yīng)功能包內(nèi)分層命名規(guī)范
| 層級職責(zé) | 類名后綴 | 包名 | 說明 |
|---|---|---|---|
| Web 接口層 | ?xxxController? | ?controller? | 接收請求、參數(shù)校驗、返回 Vo |
| Service 接口 | ?xxxService? | ?service? | 業(yè)務(wù)邏輯接口定義 |
| Service 實現(xiàn) | ?xxxServiceImpl? | ?service.impl? | 業(yè)務(wù)邏輯實現(xiàn),加事務(wù)注解 |
| 數(shù)據(jù)訪問層 | ?xxxMapper? | ?mapper? | MyBatis/MyBatis-Plus 映射接口 |
| 業(yè)務(wù)聚合處理 | ?xxxBiz? | ?biz? | 跨 Service 或外部調(diào)用的復(fù)雜業(yè)務(wù)編排 |
| 遠(yuǎn)程服務(wù)客戶端 | ?xxxClient? | ?client? | Feign 聲明式 HTTP 客戶端 |
| 對象轉(zhuǎn)換器 | ?xxxConvert? | ?convert? | 統(tǒng)一處理對象轉(zhuǎn)換 |
| AOP 切面 | ?xxxAspect? | ?aspect? | 橫切關(guān)注點(日志、權(quán)限、監(jiān)控等) |
| 常量類 | ?xxxConst? | ?constant? | 常量按業(yè)務(wù)拆分,不堆在一個類中 |
| 枚舉類 | ?xxxEnum? | ?enums? | 統(tǒng)一管理枚舉定義 |
| 自定義異常 | ?xxxException? | ?exception? | 業(yè)務(wù)異常或系統(tǒng)異常 |
| 配置類 | ?xxxConfig? | ?config? | 如 RedisConfig?、SwaggerConfig? |
| 定時任務(wù) | ?xxxJob? | ?job? | 定時調(diào)度任務(wù)類 |
| 輔助類(業(yè)務(wù)/功能) | ?xxxHelper? | 對應(yīng)功能包內(nèi) | 如 job.JobHelper?、mail.MailHelper? |
實體類命名規(guī)范
業(yè)務(wù)實體
| 對象類型 | 類名后綴 | 包路徑 | 說明 |
|---|---|---|---|
| 數(shù)據(jù)庫實體 | ?xxx? / XxxPo? | ?bean.entity? / bean.po? | 與數(shù)據(jù)庫表結(jié)構(gòu)一一對應(yīng) |
| 接口返回對象 | ?xxxVo? | ?bean.vo? | 面向前端展示 |
| 接口接收參數(shù) | ?xxxDto? | ?bean.dto? | 接收請求參數(shù),可含校驗注解 |
| 業(yè)務(wù)層聚合對象 | ?xxxBo? | ?bean.bo? | 業(yè)務(wù)邏輯層內(nèi)部使用 |
| MongoDB 文檔實體 | ?xxxDoc? | ?bean.doc? | MongoDB 實體定義 |
| 緩存實體對象 | ?xxxCache? | ?bean.cache? | Redis/Caffeine 緩存結(jié)構(gòu) |
| ES 索引實體 | ?xxxIndex? | ?bean.index? | Elasticsearch 文檔映射 |
| MQ 消息體 | ?xxxMessage? | ?bean.message? | 隊列/主題傳輸?shù)南Ⅲw |
| Spring 事件對象 | ?xxxEvent? | ?bean.event? | 領(lǐng)域事件或應(yīng)用事件對象 |
使用示例
// 保存用戶:接收 Dto,返回 Vo
@PostMapping("/save")
public SysUserVo saveUser(@RequestBody @Valid SysUserSaveDto dto) {
SysUserPo po = userConvert.toPo(dto);
userMapper.insert(po);
return userConvert.toVo(po);
}
? 不要將 Entity? / Po? 直接返回給前端
? 各層對象嚴(yán)格隔離,降低變動影響面
業(yè)務(wù)之外的實體
對于獨立于業(yè)務(wù)之外的實體,如工具類、框架配置等需要的對象,有以下兩種處理方式:
| 方式 | 適用場景 | 示例 |
|---|---|---|
| 使用內(nèi)部類 | 僅被當(dāng)前類使用、邏輯簡單、內(nèi)聚性強(qiáng) | Controller 內(nèi)部的請求/響應(yīng)類、Service 內(nèi)部的中間對象 |
| 放在業(yè)務(wù)類一起 | 與某個業(yè)務(wù)緊密相關(guān),但不屬于標(biāo)準(zhǔn)實體類型 | 業(yè)務(wù)特有的參數(shù)封裝、中間計算結(jié)果對象 |
示例
方式一:使用內(nèi)部類(適用于僅當(dāng)前類使用)
@RestController
public class UserController {
@PostMapping("/login")
public Result login(@RequestBody LoginRequest request) {
// ...
}
// 內(nèi)部類,僅用于當(dāng)前 Controller
static class LoginRequest {
private String username;
private String password;
}
}
方式二:放在業(yè)務(wù)類一起(適用于業(yè)務(wù)特有對象)
// 放在使用它的 Service 同包下,但不屬于標(biāo)準(zhǔn) bean 類型
// service/OrderStatContext.java
public class OrderStatContext {
private Long userId;
private LocalDateTime startTime;
private LocalDateTime endTime;
// 訂單統(tǒng)計的中間計算對象
}
選擇建議
- 僅當(dāng)前類使用 → 內(nèi)部類
- 業(yè)務(wù)特有但不屬于標(biāo)準(zhǔn) Entity/Vo/Dto/Bo → 放在對應(yīng)業(yè)務(wù)包下
工具類命名規(guī)范
| 類型 | 命名后綴 | 包位置 | 是否靜態(tài) | 是否依賴容器 | 說明 |
|---|---|---|---|---|---|
| 靜態(tài)工具類 | ?xxxUtil? | ?util? | ? 是 | ? 否 | 純靜態(tài)方法,無狀態(tài),不依賴 Spring |
| 容器化工具類 | ?xxxKit? | ?util? | ? 否 | ? 是 | 需要注入 Bean,加 @Component? |
| 輔助類(業(yè)務(wù)/功能) | ?xxxHelper? | 對應(yīng)功能包內(nèi) | ? 否 | ? 是 | 業(yè)務(wù)或功能專用,如 job.JobHelper? |
示例代碼
Util(靜態(tài)調(diào)用)
public class DateUtil {
public static String format(LocalDateTime date, String pattern) {
// 靜態(tài)方法,不依賴 Spring
}
}
// 使用
String dateStr = DateUtil.format(now, "yyyy-MM-dd");
Kit(注入使用,放在 util 包)
@Component
public class RedisKit {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
}
// 使用
@Service
public class UserService {
@Autowired
private RedisKit redisKit;
}
Helper(功能專用,放在對應(yīng)功能包內(nèi))
// job/JobHelper.java
@Component
public class JobHelper {
@Autowired
private MailService mailService;
public void sendAlert(String jobName, Exception e) {
mailService.send("Job Alert", jobName + " 執(zhí)行失?。? + e.getMessage());
}
}
到此這篇關(guān)于SpringBoot 代碼風(fēng)格推薦的文章就介紹到這了,更多相關(guān)SpringBoot 代碼風(fēng)格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 容器化Docker+K8s 部署最佳實踐
本文介紹了Spring Boot應(yīng)用容器化部署的完整流程:從基礎(chǔ)環(huán)境準(zhǔn)備、示例項目搭建,到 Docker 鏡像構(gòu)建(基礎(chǔ)構(gòu)建法與多階段構(gòu)建法),再到 K8s 核心資源(Deployment、Service)的部署與驗證,最后拓展了鏡像優(yōu)化、K8s 進(jìn)階配置等實用技巧,感興趣的朋友跟隨小編一起看看吧2026-01-01
JMeter連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟
本文主要介紹了JMeter操作Mysql數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12

