學(xué)習(xí)Spring IOC,看完這篇就夠了
說明
官網(wǎng)
介紹了控制反轉(zhuǎn)(IOC)原理的Spring框架實(shí)現(xiàn)。IoC也稱為依賴注入(DI)。在此過程中,對象僅通過構(gòu)造函數(shù)參數(shù),工廠方法的參數(shù)或在構(gòu)造或從工廠方法返回后在對象實(shí)例上設(shè)置的屬性來定義其依賴項(xiàng)(即,與它們一起使用的其他對象) 。然后,容器在創(chuàng)建bean時(shí)注入那些依賴項(xiàng)。此過程從根本上講是通過使用類的直接構(gòu)造或諸如服務(wù)定位器模式之類的機(jī)制來控制其依賴項(xiàng)的實(shí)例化或位置的bean本身的逆過程(因此稱為Control Inversion)。說完IOC的基本概念,就不能離開IOC所管理的對象——Bean進(jìn)行討論了。

這個(gè)圖很形象的說明獲得依賴對象的過程被反轉(zhuǎn)了。
Bean 定義
- Id
- Class
- Scope
- Constructor arguments
- Properties
- Autowiring mode
- lazy-initialization mode
- initialization/destruction method
Id和Class這里不做解釋說明,必須得保證項(xiàng)目內(nèi)唯一,不然啟動(dòng)會報(bào)出。
Scope 作用域
- singleton:單例,指一個(gè)Bean容器中只存在一份。默認(rèn)情況都是單例模式。針對此情況可以進(jìn)行池化管理封裝,達(dá)到快速響應(yīng)。
池化的目的是提升對象復(fù)用率和定制化封裝,適用于10w級以上的并發(fā)請求。
prototype:多例,每次從容器中獲取的對象都是新的。單例和多例可以根據(jù)對象的哈希值【haseCode】查看。通過注解形式注入的對象,都是單例。
request:每次http請求創(chuàng)建一個(gè)實(shí)例僅在當(dāng)前request內(nèi)有效
session、global session:同上
Constructor arguments 構(gòu)造器注入
Properties 設(shè)值注入
Autowiring mode 自動(dòng)裝配模式
Bean 生命周期
- 初始化
- 賦值
- 調(diào)用
- 銷毀
這里引申出問題一:相互依賴的Bean是如何進(jìn)行初始化的?
image.png如果沒有處理好,會拋出循環(huán)依賴的問題。
image.pngBean在實(shí)例化過程中,需要調(diào)用自身的構(gòu)造器進(jìn)行初始化,然后對成員變量進(jìn)行賦值。
成員變量賦值有兩種形式
- 構(gòu)造器注入
- 設(shè)值注入(我們常用的通過Set方法注入)
對于相互依賴的Bean進(jìn)行實(shí)例化的話,就不能通過構(gòu)造器注入。
問題二:如何保證Bean在整個(gè)容器是唯一的
這里使用到了單例模式中的雙重鎖模式
Bean 裝配
分為自動(dòng)轉(zhuǎn)配和手動(dòng)裝配
通過使用注解或是XML的形式進(jìn)行裝配
這里不做過多的闡述
說點(diǎn)和面試相關(guān)
除了向面試官闡述大家都知道的依賴注入和控制反轉(zhuǎn),你還可以說下和Bean相關(guān)的知識點(diǎn)。和IOC所相關(guān)的是Bean,包括以下幾個(gè)知識點(diǎn),感興趣的可以看下源碼或是官網(wǎng)
- Bean 定義
- Bean 生命周期
- Bean 裝配
還可以引申出
- Bean 池化處理
- Bean 創(chuàng)建過程
- Bean 相互依賴
- 容器的三級緩存

