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

spring源碼已經(jīng)看了很久了,在對spring源碼越來越熟悉的同時,也想對這一次的源碼學(xué)習(xí)做個階段性的總結(jié)。這次總結(jié)也不會一次寫完,會在后續(xù)逐漸完善。

spring與設(shè)計模式

spring對于設(shè)計模式的應(yīng)用,可以說非常的多。在分析spring源碼時候,我也常??紤],底層的反射、xml分析、依賴注入的基本原理、所謂的控制反轉(zhuǎn),這些原理說出來,現(xiàn)在我也基本明白。

那么假設(shè)在我了解這些原理的基礎(chǔ)上,讓我來寫spring,我寫出來的和spring源碼有什么差距呢?我想其中非常大的一個差距就是對于設(shè)計模式的應(yīng)用吧。所以這次分析,我先會從設(shè)計模式的角度來看下spring究竟做了啥。

設(shè)計模式六大原則

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

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

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

依賴倒置原則:依賴于抽象而不依賴于細節(jié)(面向接口編程)

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

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

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

委派模式的應(yīng)用

在AbstractAutowireCapableBeanFactory實例化Bean時候(獲取了類的各種信息,包括要創(chuàng)建的類是哪個)

這里的邏輯大概簡化下,寫成偽代碼
1)根據(jù)入?yún)⑿畔⒌日业綄?yīng)要使用的構(gòu)造函數(shù)(可能有多個構(gòu)造函數(shù))
2)如果找到了,使用該構(gòu)造函數(shù)進行初始化
3)如果找不到,使用默認構(gòu)造函數(shù)初始化

就這樣的邏輯,我們來看看spring是怎么實現(xiàn)的

autowireConstructor方法委派給ConstructorResolver
instantiateBean 方法委派給InstanitationStrategy

類圖其實挺像策略模式的 = = 這里我們不管委派模式與策略模式的區(qū)別,只看它這樣設(shè)計的核心——單一職責原則 + 開閉原則:
1)一個類只干一件事,InstantiationStrategy專心做初始化的類的事情,而AbstractAutowireCapableBeanFactory做createBean相關(guān)的邏輯組裝。如果創(chuàng)建類的邏輯有變化,createBean的組裝邏輯無需改變。相反也一樣。
2)開閉原則,假想我們創(chuàng)建類的方式有改變了,比如我希望創(chuàng)建類的方式不是簡單地使用反射調(diào)用下構(gòu)造函數(shù),我希望生成的是一個代理類。(這樣不就實現(xiàn)了aop?)那得怎么做呢?增加一個InstantiationStrategy的實現(xiàn),AbstractAutowireCapableFactory替換所使用的實現(xiàn)。就好了。完美的遵守了開閉原則。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容