簡體   English   中英

為什么依賴注射使用公共方法?

[英]Why does dependecy injection use public methods?

為什么依賴注射使用公共方法? 如果我錯了,請糾正我,但是可以使用反射來改變實現。

DI本身不是目標。 DI的目的是通過支持組合而不是繼承來實現松散耦合並且只有在為此目的公開公共API時才有可能。

如果沒有公共API,您無法以新的和退出的方式重構組件。

這是一個非常一致的聲明,但事實並非如此。 我的偏好通常是使用包私有構造函數(或者包私有類上的公共構造函數,因為它並不重要),因為它允許你自己實例化和注入一個類(沒有反射或注入器)在同一個包中的測試類中進行測試。

請記住,安全策略可能會阻止用戶通過反射API調用受保護,包私有或私有方法。 如果DI框架適用於所有環境,那么它只能依賴於公共方法。

只是詳細說明ColinD給出的答案(直到一年的Java編程,我才知道包私有類)。 使用DI框架開發的應用程序,我相信你會將接口公開,也許是一些抽象類和枚舉:

package org.my.service;

public interface Service {
    public void process();
}

然后,具體實現將是包私有(沒有公共關鍵字)

package org.my.service;

class RealService {
    public void process() {/*do something*/}
}

這強制執行信息隱藏的概念,並且意味着實現細節不會泄漏到公共API中。 這也意味着你不能在該軟件包之外使用該類(如果你嘗試,編譯時錯誤 - 你不能在任何地方“新”它)。

再次如ColinD所說,你可以對它進行單元測試,因為你的單元測試將駐留在org.my.service中。

DI框架有很多方法可以注入依賴項

  • 構造函數注入
  • 二傳手注射
  • 初始化注入
  • 現場注入

通過使用前三個,使用modifier public您可以手動設置依賴項,即使該類在DI框架之外使用也是如此。

但是,第4種選擇被廣泛使用。 您可能需要手動設置依賴項的最常見方案是單元測試。 例如,對於那個春天,提供ReflectionTestUtils ,這樣你就可以注入1行的字段,這或多或少都很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM