spring原始碼已經看了很久了,在對spring原始碼越來越熟悉的同時,也想對這一次的原始碼學習做個階段性的總結。這次總結也不會一次寫完,會在後續逐漸完善。
spring對於設計模式的應用,可以說非常的多。在分析spring原始碼時候,我也常常考慮,底層的反射、xml分析、依賴注入的基本原理、所謂的控制反轉,這些原理說出來,現在我也基本明白。
那麼假設在我了解這些原理的基礎上,讓我來寫spring,我寫出來的和spring原始碼有什麼差距呢?
我想其中非常大的乙個差距就是對於設計模式的應用吧。所以這次分析,我先會從設計模式的角度來看下spring究竟做了啥。
設計模式六大原則
學設計模式時候,我們知道設計模式有六大原則。spring原始碼再如何抽象封裝,究其根本,都是向這六大原則靠齊,所以先列下這六大原則。
單一職責原則:乙個類只幹一件事(引起類變化的原因只有乙個)在abstractautowirecapablebeanfactory例項化bean時候(獲取了類的各種資訊,包括要建立的類是哪個)黎克特制替換原則:能使用基類的地方,一定都能使用子類
依賴倒置原則:依賴於抽象而不依賴於細節(面向介面程式設計)
介面隔離原則:介面盡可能小(要為各個類建立專用的介面,而不要試圖去建立乙個很龐大的介面供所有依賴它的類去呼叫)
迪公尺特法則:乙個物件應該對其他物件保持最少的了解。
開閉原則 :乙個類應該對擴充套件開放,對於修改關閉(如果需要修改或新增功能,盡可能不要修改舊的**)
這裡的邏輯大概簡化下,寫成偽**
1)根據入參資訊等找到對應要使用的建構函式(可能有多個建構函式)
2)如果找到了,使用該建構函式進行初始化
3)如果找不到,使用預設建構函式初始化
就這樣的邏輯,我們來看看spring是怎麼實現的
autowireconstructor方法委派給constructorresolverinstantiatebean 方法委派給instanitationstrategy
類圖其實挺像策略模式的 = = 這裡我們不管委派模式與策略模式的區別,只看它這樣設計的核心——單一職責原則 + 開閉原則:
1)乙個類只幹一件事,instantiationstrategy專心做初始化的類的事情,而abstractautowirecapablebeanfactory做createbean相關的
邏輯組裝
。如果建立類的邏輯有變化,createbean的組裝邏輯無需改變。相反也一樣。2)開閉原則,假想我們建立類的方式有改變了,比如我希望建立類的方式不是簡單地使用反射呼叫下建構函式,我希望生成的是乙個**類。(這樣不就實現了aop?)那得怎麼做呢?增加乙個instantiationstrategy的實現,abstractautowirecapablefactory替換所使用的實現。就好了。完美的遵守了開閉原則。
util包原始碼(九) 階段性總結
一 總體框架 二 collection colletcion介面下有兩大繼承 list和set list set是否有序 linkedlist有序,其他無序 hashset無序,treeset有序 元素是否可重複是否 具體實現 arraylist linkedlist vector hashset ...
Raytrace學習的階段性總結
最近乙個月一直在學習raytrace,從理論到 實現,之前最近才終於有了乙個比較完整的版本,遂打算把之前的一些學習經歷寫出來。raytrace又稱光線跟蹤,業界公認此演算法為turner whitted在1980年提出,而它本身又是由原來的光線投射演算法 ray casting 演變而來的,ray ...
Spring階段性學習總結(十 三)重用切點表示式
即將之前的每個方法上的 before 裡大段的包名 類名 方法名做簡化,定義乙個 pointcut的方法,引數是之前其他註解的引數,然後在其他方法的註解引數中 呼叫該方法即可,1 pointcut execution public int springaopimp.calculatorimp.add...