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)。就好了。完美的遵守了開閉原則。