Spring IOC簡介

控制反轉(Inversion of Control)

正常的情況下,比如有一個類,在類裡面有方法(不是靜態的方法),調用類裡面的方法,創建類的對象,使用對象調用方法,創建類對象的過程,需要new出來對象。通過控制反轉,把對象的創建不是通過new方式實現,而是交給Spring配置創建類對象。控制反轉是一種在軟體工程中解耦合的思想,調用類只依賴介面,而不依賴具體的實現類,減少了耦合。控制權交給了容器,在運行的時候才由容器決定將具體的實現動態的「注入」到調用類的對象中。

依賴注入(Dependency Injection)

它提供一種機制,將需要依賴對象的引用傳遞給被依賴對象

Spring IOC 依賴注入方式:構造方法注入;setter方法注入;介面注入;

構造方法注入:顧名思義,構造方法注入,就是被注入對象可以通過在其構造方法中聲明依賴對象的參數列表, 讓外部(通常是IoC容器)知道它需要哪些依賴對象。IoC Service Provider會檢查被注入對象的構造方法,取得它所需要的依賴對象列表,進而為其注入相應的對象。同一個對象是不可能被構造兩次的,因此,被注入對象的構造乃至其整個生命周期, 應該是由IoC Service Provider來管理的。

構造方法注入方式比較直觀,對象被構造完成後,即進入就緒狀態,可以馬上使用。

setter方法注入:對於JavaBean對象來說,通常會通過setXXX()和getXXX()方法來訪問對應屬性。這些setXXX()方 法統稱為setter方法,getXXX()當然就稱為getter方法。通過setter方法,可以更改相應的對象屬性,通 過getter方法,可以獲得相應屬性的狀態。所以,當前對象只要為其依賴對象所對應的屬性添加setter 方法,就可以通過setter方法將相應的依賴對象設置到被注入對象中。

介面注入:相對於前兩種注入方式來說,介面注入沒有那麼簡單明了。被注入對象如果想要IoC Service Provider為其注入依賴對象,就必須實現某個介面。這個介面提供一個方法,用來為其注入依賴對象。 IoC Service Provider最終通過這些介面來了解應該為被注入對象注入什麼依賴對象。

注入方式比較
  • 介面注入:從注入方式的使用上來說,介面注入是現在不甚提倡的一種方式,基本處於「退 役狀態」。因為它強制被注入對象實現不必要的介面,帶有侵入性。而構造方法注入和setter 方法注入則不需要如此。

  • 構造方法注入:這種注入方式的優點就是,對象在構造完成之後,即已進入就緒狀態,可以 馬上使用。缺點就是,當依賴對象比較多的時候,構造方法的參數列表會比較長。而通過反 射構造對象的時候,對相同類型的參數的處理會比較困難,維護和使用上也比較麻煩。而且 在Java中,構造方法無法被繼承,無法設置默認值。對於非必須的依賴處理,可能需要引入多 個構造方法,而參數數量的變動可能造成維護上的不便。

  • setter方法注入:因為方法可以命名,所以setter方法注入在描述性上要比構造方法注入好一些。 另外,setter方法可以被繼承,允許設置默認值,而且有良好的IDE支援。缺點當然就是對象無

    法在構造完成後馬上進入就緒狀態。

Spring 容器

容器類型:Spring提供了兩種容器類型:BeanFactory和ApplicationContext。

BeanFactory:基礎類型IoC容器,提供完整的IoC服務支援。如果沒有特殊指定,默認採用延遲初始化策略(lazy-load)。只有當客戶端對象需要訪問容器中的某個受管對象的時候,才對該受管對象進行初始化以及依賴注入操作。所以,相對來說,容器啟動初期速度較快,所需 要的資源有限。對於資源有限,並且功能要求不是很嚴格的場景,BeanFactory是比較合適的 IoC容器選擇。

ApplicationContext:ApplicationContext在BeanFactory的基礎上構建,是相對比較高級的容器實現,除了擁有BeanFactory的所有支援,ApplicationContext還提供了其他高級特性,比如事件發布、國際化資訊支援等。相對於BeanFactory來 說,ApplicationContext要求更多的系統資源,同時,因為在啟動時就完成所有初始化,容器啟動時間較之BeanFactory也會長一些。在那些系統資源充足,並且要求更多功能的場景中, ApplicationContext類型的容器是比較合適的選擇。

總結

image-20220605132906658

Tags: