控制反轉 和 依賴注入
控制反轉程式設計思想的定義
控制反轉就是我們經常聽所的英文縮寫 IoC,英文全名是 Inverse of Controller
1. 控制反轉不是一種技術,而是一種軟體開發中比較先進的程式設計思想
說道先進,那麼我們先聊聊比較落後的程式設計思想吧。 傳統的程式設計思想是應用程式在執行的過程中可能會需要其他類的物件,這時候應用程式會先建立需要的類物件,也就是說應用程式在執行時需要啥,自己動手通過new創建出物件,主動權在應用程式。簡單的說就是應用程式自己動手,豐衣足食。 而控制反轉就是讓應用程式將控制權交出來,Spring所倡導的開發方式就是:所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷燬都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件都被spring控制,所以這叫控制反轉。
理解好Ioc的關鍵是要明確“誰控制誰,控制什麼,何為反轉(有反轉就應該有正轉了),如何反轉了”,那我們來深入分析一下: ●誰控制誰,控制什麼:剛才說過傳統的Java EE程式是在程式執行的時候程式自己通過new來建立需要的物件,而spring則是通過容器來建立物件,所以說是IOC容器控制物件的建立。 ●何為反轉,如何反轉了:反轉其實是程式交出控制權,本來物件的建立是程式自己完成的,而現在是IOC在程式需要的時候建立物件並注入程式中,這就是控制權的反轉。執行程式由主動建立變被動接受需要的物件的過程就是反轉的過程。
控制反轉程式設計思想的優點
傳統的應用開發就像這些齒輪,他們之間的耦合度很高,每一個模組都需要依賴於其他模組,想想其中如果某個模組出現了問題,是不整個系統就崩潰了,不能運行了;而且在開發的過程中整個系統的各個模組要一起開發,因為在開發B模組的時候可能需要A模組,如果想在之後新增新的功能需要改動的工作量可能會很大,這些都給開發帶來了很大的不方便。
控制反轉程式設計思想的方案——依賴注入
在文章的開頭說過:控制反轉是一種思想,其具體實現就是依賴注入!
剛才已經說了控制反轉了,那控制反轉是怎麼實現的呢?
就是通過依賴注入實現的。其實控制反轉與依賴注入不就是一件事的不同說法嗎?
理解DI的關鍵是:“誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼”,那我們來深入分析一下:
●誰依賴於誰:當然是應用程式依賴於IoC容器;
●為什麼需要依賴:應用程式需要IoC容器來提供物件需要的外部資源;
●誰注入誰:很明顯是IoC容器注入應用程式某個物件,應用程式依賴的物件;
●注入了什麼:就是注入某個物件所需要的外部資源(包括物件、資源、常量資料)。
很顯然有了IOC應用程式成了衣來伸手飯來張口的大少爺,什麼都不用幹了,就是活著,當然或者需要依賴外界的資源,餓了爸媽喂,沒錢了爸媽給;爸媽喂、給的過程不就是注入嗎?
寫到這我們應該對控制反轉和依賴注入有了清楚的認識。
總結:
我們可以把IOC容器的工作模式看做是工廠模式的昇華,可以把IOC容器看作是一個工廠,這個工廠裡要生產的物件都在配置檔案中給出定義,然後利用程式語言的的反射程式設計,根據配置檔案中給出的類名生成相應的物件。從實現來看,IOC是把以前在工廠方法裡寫死的物件生成程式碼,改變為由配置檔案來定義,也就是把工廠和物件生成這兩者獨立分隔開來,目的就是提高靈活性和可維護性。