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

Spring 依賴注入:設值注入 vs 建構子注入優劣勢詳細比較

     編輯:程式設計疑難解答

核心概念

特性設值注入建構子注入
方式Setter 方法 / 屬性建構子參數
強制性選用依賴必要依賴
不可變性物件建立後可變更建立後不可變 (final)
循環依賴支援不支援 (需 @Lazy 或重構)
測試友善度需手動呼叫 setter建構子直接傳入 mock

詳細優劣勢分析

建構子注入優勢(現代 Spring 推薦)

  • 不可變性:依賴在建構時確定,執行期不會意外變更,執行緒安全
  • 必要依賴明確:缺少參數編譯即報錯,而非執行期 NPE
  • 最終欄位:可搭配 final 關鍵字,編譯器保證初始化一次
  • 單元測試簡單:new Service(new MockRepo()) 無需 Spring 容器
  • IDE 支援:重構、查找引用更精準

設值注入適用場景

  • 選用依賴:有合理預設值,可不注入也能運作
  • 循環依賴:A 需 B、B 需 A 時,至少一方需用設值注入打破循環
  • 遗留代碼:大量無參建構子的舊類別
  • 框架整合:某些框架要求無參建構子 (如 JPA 實體、部分序列化庫)

Spring 官方演進建議

Spring 4.x 之前:推薦設值注入
Spring 4.x ~ 5.x:兩者並重
Spring 5.1+ / Spring Boot 2.2+:強烈推薦建構子注入

實務最佳模式

@Service
@RequiredArgsConstructor // Lombok 自動產生建構子
public class OrderService {
    
    // 必要依賴:建構子注入 + final
    private final OrderRepository orderRepository;
    private final PaymentService paymentService;
    
    // 選用依賴:Setter 注入 + @Autowired(required=false)
    @Autowired(required = false)
    private NotificationService notificationService;
    
    // 或使用 @Lazy 打破循環依賴
    @Autowired
    @Lazy
    private CircularDependencyService circularService;
}

參考資源

CSDN - Spring 注入方式詳細比較

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