spring深入學習(一)深入理解 Spring IOC
1、IOC理論
- IOC英文縮寫:Inversion of control, 另一個縮寫為DI:依賴注入(Denpency Injection)
- 用作控制反轉
- 理解:spring IOC就是負責物件生命週期和物件之間的關係
以找女朋友為例子:
一般情況下我們是如何來找女朋友的呢?首先我們需要根據自己的需求(漂亮、身材好、性格好)找一個妹子,然後到處打聽她的興趣愛好、微信、電話號碼,然後各種投其所好送其所要,最後追到手。如下:
/** * 年輕小夥子 */ public class YoungMan { private BeautifulGirl beautifulGirl; YoungMan(){ // 可能你比較牛逼,指腹為婚 // beautifulGirl = new BeautifulGirl(); } public void setBeautifulGirl(BeautifulGirl beautifulGirl) { this.beautifulGirl = beautifulGirl; } public static void main(String[] args){ YoungMan you = new YoungMan(); BeautifulGirl beautifulGirl = new BeautifulGirl("你的各種條件"); beautifulGirl.setxxx("各種投其所好"); // 然後你有女票了 you.setBeautifulGirl(beautifulGirl); } }
程式碼中,我們找女朋友需要我們自己取建立,善後,採購構建自己的女朋友。
而IOC的思想就是:相當於婚介所代替我們建立,善後這個過程,我麼只要使用就可以了。
虛線:是沒有IOC狀態,被注入物件直接依賴被依賴物件。
實線:當被注入物件需要什麼服務時,IOC會把相應的被依賴的物件注入到被注入物件中。
注入的方法:
(1)構造器注入:
YoungMan(BeautifulGirl beautifulGirl){
this.beautifulGirl = beautifulGirl;
}
(2)setter注入:
public class YoungMan { private BeautifulGirl beautifulGirl; public void setBeautifulGirl(BeautifulGirl beautifulGirl) { this.beautifulGirl = beautifulGirl; } }
(3)介面方式注入:
需要被依賴的物件實現不必要的介面,帶有侵入性。
spring IOC四點必須理清:
- 誰控制誰:在傳統的開發模式下,我們都是採用直接 new 一個物件的方式來建立物件,也就是說你依賴的物件直接由你自己控制,但是有了 IOC 容器後,則直接由 IoC 容器來控制。所以“誰控制誰”,當然是 IoC 容器控制物件。
- 控制什麼:控制物件。
- 為何是反轉:沒有 IOC 的時候我們都是在自己物件中主動去建立被依賴的物件,這是正轉。但是有了 IOC 後,所依賴的物件直接由 IOC 容器建立後注入到被注入的物件中,依賴的物件由原來的主動獲取變成被動接受,所以是反轉。
- 哪些方面反轉了
2、各個元件
spring最核心的五個元件為:Resource體系、BeanFactory 體系、Beandefinition 體系、BeandefinitionReader體系、ApplicationContext體系
(1)Resource體系(代表了一種資源的訪問策略,如ClasspathResource 、 URLResource ,FileSystemResource)
圖示:
有了資源就得載入,Spring 利用 ResourceLoader 來進行統一資源載入,圖示:
(2)BeanFactory 體系
BeanFactory是一個bean容器,其中 BeanDefinition 是她的基本結構,它內部維護著一個 BeanDefinition map ,並可根據 BeanDefinition 的描述進行 bean 的建立和管理。
BeanFacoty 有三個直接子類ListableBeanFactory
、HierarchicalBeanFactory
和 AutowireCapableBeanFactory
,DefaultListableBeanFactory
為最終預設實現,它實現了所有介面
(3)Beandefinition 體系
BeanDefinition 用來描述 Spring 中的 Bean 物件
(4)BeandefinitionReader體系
BeanDefinitionReader 的作用是讀取 Spring 的配置檔案的內容,並將其轉換成 Ioc 容器內部的資料結構:BeanDefinition
(5)ApplicationContext體系
這個就是大名鼎鼎的 Spring 容器,它叫做應用上下文,與我們應用息息相關,她繼承 BeanFactory,所以它是 BeanFactory 的擴充套件升級版,如果BeanFactory 是屌絲的話,那麼 ApplicationContext 則是名副其實的高富帥。由於 ApplicationContext 的結構就決定了它與 BeanFactory 的不同,其主要區別有:
- 繼承 MessageSource,提供國際化的標準訪問策略。
- 繼承 ApplicationEventPublisher ,提供強大的事件機制。
- 擴充套件 ResourceLoader,可以用來載入多個 Resource,可以靈活訪問不同的資源。
- 對 Web 應用的支援。
摘自:死磕spring —— 僅應用於個人學習