天天看點

spring源碼的收獲(階段性總結)

spring源碼已經看了很久了,在對spring源碼越來越熟悉的同時,也想對這一次的源碼學習做個階段性的總結。這次總結也不會一次寫完,會在後續逐漸完善。

spring與設計模式

spring對于設計模式的應用,可以說非常的多。在分析spring源碼時候,我也常常考慮,底層的反射、xml分析、依賴注入的基本原理、所謂的控制反轉,這些原理說出來,現在我也基本明白。

那麼假設在我了解這些原理的基礎上,讓我來寫spring,

我寫出來的和spring源碼有什麼差距呢?

我想其中非常大的一個差距就是對于設計模式的應用吧。是以這次分析,我先會從設計模式的角度來看下spring究竟做了啥。

設計模式六大原則

學設計模式時候,我們知道設計模式有六大原則。spring源碼再如何抽象封裝,究其根本,都是向這六大原則靠齊,是以先列下這六大原則。

單一職責原則:一個類隻幹一件事(引起類變化的原因隻有一個)

裡氏替換原則:能使用基類的地方,一定都能使用子類

依賴倒置原則:依賴于抽象而不依賴于細節(面向接口程式設計)

接口隔離原則:接口盡可能小(要為各個類建立專用的接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調用)

迪米特法則:一個對象應該對其他對象保持最少的了解。

開閉原則 :一個類應該對擴充開放,對于修改關閉(如果需要修改或新增功能,盡可能不要修改舊的代碼)

委派模式的應用

在AbstractAutowireCapableBeanFactory執行個體化Bean時候(擷取了類的各種資訊,包括要建立的類是哪個)

這裡的邏輯大概簡化下,寫成僞代碼

1)根據入參資訊等找到對應要使用的構造函數(可能有多個構造函數)

2)如果找到了,使用該構造函數進行初始化

3)如果找不到,使用預設構造函數初始化

就這樣的邏輯,我們來看看spring是怎麼實作的

spring源碼的收獲(階段性總結)
spring源碼的收獲(階段性總結)
spring源碼的收獲(階段性總結)

autowireConstructor方法委派給ConstructorResolver

instantiateBean 方法委派給InstanitationStrategy

spring源碼的收獲(階段性總結)

類圖其實挺像政策模式的 = = 這裡我們不管委派模式與政策模式的差別,隻看它這樣設計的核心——單一職責原則 + 開閉原則:

1)一個類隻幹一件事,InstantiationStrategy專心做初始化的類的事情,而AbstractAutowireCapableBeanFactory做createBean相關的

邏輯組裝

。如果建立類的邏輯有變化,createBean的組裝邏輯無需改變。相反也一樣。

2)開閉原則,假想我們建立類的方式有改變了,比如我希望建立類的方式不是簡單地使用反射調用下構造函數,我希望生成的是一個代理類。(這樣不就實作了aop?)那得怎麼做呢?增加一個InstantiationStrategy的實作,AbstractAutowireCapableFactory替換所使用的實作。就好了。完美的遵守了開閉原則。