首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Spring MVC 三層架構詳解:持久層/業務層/控制層職責劃分與呼叫鏈路

     編輯:程式設計疑難解答

Spring MVC 標準三層架構:**Controller (控制層) → Service (業務層) → DAO/Mapper (持久層) → Database**。各層職責單一、依賴倒置、便於測試與維護。

層級職責對照表

層級典型類別/註解核心職責不應包含
持久層 (DAO/Mapper)`@Repository`, `Mapper` 接口, `JdbcTemplate`, `MyBatis` XML**只做 CRUD**:SQL 執行、結果映射、事務邊界 (可選)業務邏輯、參數校驗 (除主鍵)、HTTP 概念
業務層 (Service)`@Service`, `@Transactional`**核心業務邏輯**:流程編排、規則驗證、跨表操作、事務管理、異常轉換SQL 細節、HTTP 請求/回應、視圖邏輯
控制層 (Controller)`@Controller`/`@RestController`, `@RequestMapping`**HTTP 介面**:參數接收/校驗 (JSR-303)、呼叫 Service、組裝回應 (JSON/View)、異常處理業務邏輯、SQL、資料庫連線

呼叫鏈路範例

// 1. Controller 接收請求
@PostMapping("/orders")
public Result createOrder(@Valid @RequestBody OrderDTO dto) {
    Long orderId = orderService.createOrder(dto); // 2. 呼叫 Service
    return Result.success(orderId);
}

// 2. Service 業務流程
@Service
@RequiredArgsConstructor
public class OrderService {
    private final OrderMapper orderMapper;
    private final ProductMapper productMapper;
    private final InventoryService inventoryService;

    @Transactional(rollbackFor = Exception.class)
    public Long createOrder(OrderDTO dto) {
        // 2.1 參數深度校驗 (庫存、價格、優惠)
        // 2.2 鎖定庫存 (調用 InventoryService)
        inventoryService.lockStock(dto.getItems());
        // 2.3 落單 (調用 DAO)
        Order order = dto.toEntity();
        orderMapper.insert(order);
        // 2.4 發送事件 (MQ) - 可選
        return order.getId();
    }
}

// 3. Mapper 只做 SQL
@Mapper
public interface OrderMapper {
    @Insert("INSERT INTO orders(...) VALUES(#{...})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Order order);
}

常見錯誤與最佳實踐

  • **Controller 做業務**:如在 Controller 寫 `if-else` 判斷庫存 → 應下沉到 Service。
  • **Service 寫 SQL**:使用 `jdbcTemplate` 直寫 SQL → 應委託 Mapper/Repository。
  • **事務在 Controller**:`@Transactional` 加在 Controller 方法 → 僅能在 Service/DAO 生效,Controller 不應管理事務。
  • **跨層傳遞 Entity**:Controller 直接操作 JPA Entity → 應用 DTO/VO 隔離持久化模型。
  • **單元測試**:Service 層最易測試 (Mock Mapper),Controller 測試用 `MockMvc`,DAO 測試用 `@DataJpaTest` / 測試資料庫。

擴充:四層/五層架構

大型專案常在 Service 下再分 **Domain Service** (核心領域邏輯)、**Application Service** (用例編排);Controller 上加 **Facade/Assembler** (DTO 轉換);DAO 下加 **Repository** (聚合根存取)。但核心原則不變:**依賴方向向內,業務邏輯不外洩**。

理解三層邊界,是寫出可維護 Spring 應用的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved