1.4 Spring IOC 和 DI原理

一、IOC是什麼?
IOC全稱爲“Inversion of Control”,即控制反轉,不是一種技術,而是一種設計思想。在這種設計思想中,你設計好的對象交給容器管理,而不是在應用程序內部對對象進行管理。控制的含義是IOC容器控制了對象(也可以包括文件及其他外部資源);而反轉的含義是IOC容器負責創建及注入依賴的對象,但在傳統的應用程序中,我們需要在對象內部去創建(new)依賴的對象,這叫“正”,在這樣的情況下,對象之間的耦合度就非常高。IOC更像是一種中介,幫助僱傭者和被僱傭者。我覺得支付工具如支付寶就像是淘寶體系中的一個IOC。
二、DI是什麼?
DI全稱爲“Dependency Injection”,即依賴注入,在系統運行過程中,動態的向某個對象注入它所依賴的對象。比如A依賴一個對象B(一般依賴的是接口),在運行前,A並不知道自己依賴的B的具體實現是怎麼樣的,IOC容器會在適當的時候爲A創建一個合適的B對象,並且注入,這就是依賴注入。
三、IOC與DI的關係?
IOC是一個比DI更爲寬泛的概念,但是其思想是類似的。IOC是一種目的,DI是一種手段,爲了達到控制反轉的目的,即程序員不需要自己new對象,對象由容器控制這個目的,Spring框架提供了依賴注入的手段,哪裏需要對象,就在哪裏注入。
四、IOC的優點?
1、資源不再由使用的雙方管理,而是由第三方集中管理,實現了資源的可配置和易管理,降低了使用雙方的耦合度,使得面向接口編程更容易實現,使得系統架構可擴展性更加高。
2、易實現各種設計模式,如策略模式,不需要自己構建策略對象池(結合項目)。
3、不需要再new對象,編碼更加簡單。傳統的開發中,Servlet依賴於一個XXXService時,需要在每個Serlvet中都new一個XXXService,容易導致對象重複,浪費JVM的堆空間,當然也可以使用單例模式,但是需要自己編寫,代碼更復雜。
五、Spring 容器結構。
簡單的說,Spring容器中主要有Bean定義註冊表、Bean緩存池。Bean定義註冊表(BeanDefinitionRegistry)存儲Bean定義(BeanDefinition),BeanDefinition描述Bean的配置信息,可以來自xml配置文件中的<bean>,也可以來自Java代碼或註解聲明的Bean。Bean緩存池是一個HashMap,Key爲Bean的Id,而Value爲對象。

                                    (圖片來自網絡)
Spring 容器通過配置文件描述Bean描述信息及Bean之間的依賴關係,利用Java語言的反射功能實例化Bean並建立Bean之間的依賴關係。Spring在完成這些底層工作的基礎上,還提供了Bean實例緩存、生命週期管理、Bean實例代理、事件發佈等高級服務。
六、BeanFactory
BeanFactory是Spring框架的基礎設施,面向Spring本身,一般程序員不會直接使用BeanFactory,是各種BeanFactory的頂層接口,主要提供的是各種getBean()方法。
七、ApplicationContext
ApplicationContext是由BeanFactory派生而來,提供了許多更加高級的功能。
八、容器加載Bean的過程
1、BeanDefinitionReader讀取Resource所執行的配置文件資源,解析配置文件,並將生成的BeanDefinition對象保存到BeanDefinitionRegistry中。
2、容器掃描Bean定義註冊表中的BeanDefinition對象,調用InstantiationStrategy進行Bean實例化的工作;採用BeanWrapper完成Bean屬性的設置工作。
3、若是單例的Bean,則將Bean緩存在Bean緩存器中。
發佈了24 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章