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

Java 分層架構:為什麼 DAO 層與 Service 層都要定義介面?

     編輯:程式設計疑難解答

題主疑問

DAO 層針對不同資料庫有不同實現,定義介面易理解。但 Service 層業務邏輯通常唯一,為何也要介面?

Service 層定義介面的四大理由

  1. 面向介面編程(DIP):上層(Controller)依賴抽象 UserService,而非具體 UserServiceImpl。便於替換實現(如切換緩存策略、引入 AOP 代理)。
  2. Spring AOP 代理機制:Spring 預設使用 JDK 動態代理,**要求目標類實現介面**。無介面則需開啟 CGLIB(繼承代理),有最終類/方法限制。
  3. 多實現場景:雖少見,但存在「同一業務邏輯不同版本」需求,如 UserServiceV1、UserServiceV2 並行灰度發布,介面使切換無感。
  4. 測試友好:單元測試時易於 Mock 介面(Mockito mock(UserService.class)),不需啟動完整 Spring 上下文。

DAO 層介面的必要性(補充)

  • 支援多資料源:UserDaoMySQL、UserDaoOracle、UserDaoRedis 實現同一 UserDao。
  • MyBatis Mapper 介面即 DAO 介面,框架自動生成實現。

最佳實踐建議

  • Service 介面命名 UserService,實現類 UserServiceImpl。
  • Controller 注入介面:@Autowired UserService userService;
  • 若確定永不需 AOP/多實現/測試 Mock,可省略介面直接用類,但違反團隊規範風險較大。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved