從協作到合約 參考讀物 關于依靠項插入的經典介紹,請參閱 Martin Fowler 的 “Inversion of Control Containers and the Dependency Injection Pattern”。關于使用 Spring 的依靠項插入的更多內容,請參閱 Professional java Development with the Spring Framework。這兩者的鏈接都在 參考資料 中。 針對這篇文章的目的,可以把依靠項插入想像成對象和對象的執行環境之間的合約。對象(執行 ResourceConsumer、 Collaborator 和 ServiceClient 的其中一個角色或全部角色)同意不出去搜索自己需要的資源、它與之協作的合作伙伴或它使用的服務。相反,對象提供一種機制,讓這些依靠項可以提供給它。接下來,執行環境同意在對象需要它的依靠項之前,向對象提供所有的依靠項。
解析依靠項的方法在不同的場景中各有不同。例如,在單元測試用例中,對象的執行環境是測試用例本身,所以測試設置代碼有責任直接滿足依靠項。在集成測試或應用程序在生產環境時,代理 負責尋找滿足對象依靠項的資源,并把它們傳遞給對象。代理的角色通常是由輕量級容器扮演的,例如 Spring 框架。不管依靠項是如何解析的,被配置的對象通常不知道這類細節。在第二個示例中,它可能還不知道代理的存在。
代理(例如 Spring 框架)有四個要害職責,在整篇文章中我將不斷提到這些職責,它們是:
確定對象需要配置(通常因為對象剛剛創建)
確定對象的依靠項
發現滿足這些依靠項的對象
用對象的依靠項對它進行配置
從下面的各種依靠項插入解決方案可以看出,解決這些職責有多種策略。 使用 Spring 進行依靠項插入
在標準的 Spring 部署中,Spring 容器同時負責創建和配置核心應用程序對象(稱為 bean)。因為容器既創建對象,又扮演代理的角色,所以對 Spring 容器來說,確定 bean 已經創建而且需要配置是件輕而易舉的小事。通過查詢應用程序的元模型,可以確定 bean 的依靠項,元模型通常是在 Spring 的配置文件中用 xml 表示的。
滿足 bean 的依靠項的對象是容器治理的其他 bean。容器充當這些 bean 的倉庫,所以可以用名稱查詢它們(或者在需要的時候創建)。最后,容器用新 bean 的依靠項對其進行配置。這通常是通過 setter 插入完成的(調用新 bean 的 setter 方法,把依靠項作為參數傳遞進去),雖然 Spring 支持其他形式的插入,例如構造函數插入和查詢方法插入(請參閱 參考資料 學習關于使用 Spring 進行依靠項插入的更多內容。)