什麼是控制反轉和依賴注入?

Spring Framework的核心是基於控制反轉的原理。 IoC是一種技術外部化組件依賴關係的創建和管理。 考慮一個類的例子Foo依賴於類Bar的實例來執行某種處理。 傳統上,Foo創造了一個Bar的實例使用new運算符或從某種工廠類中獲取。 使用IoC方法,Bar(或子類)的實例在運行時由一些外部進程提供給Foo。 這個行爲,在運行時注入依賴項,導致IoC被Martin Fowler重命名爲更具描述性的依賴注入(DI)。Spring的DI實現基於兩個核心Java概念:JavaBeans和接口。 當你使用Spring作爲DI提供程序,您可以靈活地在您的內部定義依賴項配置應用程序以不同的方式(例如,XML文件,Java配置類,您的應用程序中的註釋)代碼,或新的Groovy bean定義方法)。 JavaBeans(POJO)爲其提供標準機制創建可以通過多種方式配置的Java資源,例如構造函數和setter方法。

接口和DI是互利的技術。清晰的設計和編碼接口的應用程序使得應用程序變得靈活,但是將使用接口設計的應用程序相當高,給開發人員增加了額外的編碼負擔。通過使用DI,您可以減少在應用程序中使用基於接口的設計所需的代碼量幾乎爲零。同樣,通過使用接口,你可以充分利用DI,因爲你的豆子可以利用任何接口實現來滿足它們的依賴性。接口的使用也允許Spring利用JDK動態代理( Proxy模式),爲橫切關注點提供強大的概念,如AOP。在DI的上下文中,Spring更像一個容器,而不是一個框架——提供了的實例應用程序類具有他們需要的所有依賴項,但是它以一種更少侵擾的方式這樣做。使用DI的Spring只依賴於在你的類中遵循JavaBeans命名約定——沒有可繼承的特殊類別,也沒有可遵循的專有命名方案。如果有的話在使用DI的應用程序中,唯一的改變是在JavaBeans上公開更多的屬性,因此允許在運行時注入更多的依賴項。

依賴注入的演變

在過去的幾年裏,由於Spring和其他DI框架的普及,DI已經獲得了廣泛的應用Java開發人員社區的接受度。 與此同時,開發人員確信使用DI是應用程序開發的最佳實踐,使用DI的好處也很好理解。當Java Community Process(JCP)採用JSR-330時,DI的受歡迎程度得到了認可(2009年的依賴注入)JSR-330已經成爲正式的Java規範請求,並且作爲您可能期望,規範領導者之一是Spring Johnson的創始人Rod Johnson。在JEE 6中,JSR-330成爲整個技術堆棧中包含的規範之一。 同時,EJB體系結構(從3.0版開始)也得到了極大的改進; 它採用了DI模型爲了簡化各種Enterprise JavaBeans應用程序的開發。

 •減少代碼冗餘:DI的最大優點之一是它具有顯着的能力減少你必須編寫的代碼量來粘合你的組件一起申請。 通常這段代碼是微不足道的,因此創建依賴包含只需創建一個對象的新實例。 但是,冗餘代碼可以得到相當的當您需要在JNDI存儲庫中查找依賴項時或者在需要時查找不能像遠程資源那樣直接調用依賴項。 在在這些情況下,DI可以通過提供自動JNDI查找來真正簡化冗餘代碼和遠程資源的自動代理。

•簡化應用程序配置:通過採用DI,您可以大大簡化配置應用程序的過程。 您可以使用各種選項進行配置那些可注入其他類的類。 您可以使用相同的技術爲注入適當的“注入器”表達依賴性要求bean實例或屬性。 此外,DI使交換一個更簡單爲另一個人實施依賴。 考慮你有一個案例DAO組件,對PostgreSQL數據庫執行數據操作您想要升級到Oracle。 使用DI,您可以簡單地重新配置相應的依賴於業務對象來使用Oracle實現而不是PostgreSQL之一。

•能夠在單個存儲庫中管理公共依賴項:使用傳統的公共服務的依賴管理方法 - 例如,數據源連接,事務和遠程服務 - 您創建實例(或查找來自某些工廠類的你需要它們的依賴項依賴類)。 這將導致依賴關係在各個類中傳播您的應用程序,並更改它們可能會有問題。 當你使用DI時,所有的有關這些公共依賴項的信息包含在單個存儲庫中,使依賴關係的管理更簡單,更不容易出錯。

•提高可測試性:當您爲DI設計類時,可以實現輕鬆替換依賴項。 當您測試時,這尤其方便應用。 考慮執行一些複雜處理的業務對象; 對於其中一部分,它使用DAO訪問存儲在關係數據庫中的數據。 爲了你的測試,你對測試DAO不感興趣; 你只是想測試業務對象有各種數據集。 在傳統方法中,業務對象是負責獲取DAO本身的實例,您很難進行測試這,因爲您無法使用模擬輕鬆替換DAO實現返回測試數據集的實現。 相反,你需要確保您的測試數據庫包含正確的數據並使用完整的DAO實現爲了你的測試。 使用DI,您可以創建DAO對象的模擬實現返回測試數據集,然後您可以將其傳遞給業務對象用於檢測。 可以擴展此機制以測試應用程序的任何層並且對於測試可以創建mock的Web組件特別有用HttpServletRequest和HttpServletResponse的實現。

•培養良好的應用程序設計:DI的設計通常意味着設計對接口。 一個典型的注入式應用程序設計爲所有主要組件被定義爲接口,然後是具體的實現使用DI容器創建並連接這些接口。 這種在DI和基於DI的容器出現之前,Java中的設計是可行的Spring,但是使用Spring,你可以免費獲得大量的DI功能能夠專注於構建應用程序邏輯,而不是支持它的框架

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章