[英]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.