Spring中的設計模式(工廠單例代理模板適配器)

1、Spring涵蓋的內容很廣,而且受我現在的知識面的限制,很多知識其實看着很是模糊,並不能全面的瞭解它。而且我覺得很多理論的知識最終也是以代碼的形式體現。而看源碼我覺得了解設計模式是必不可少的,所以今天就講一下Spring中的設計模式。

Java設計模式應該有23種,有人總結spring中運用的設計模式有8種:工廠模式、單例模式、代理模式、模板模式、適配器模式、包裝器模式、觀察者模式、策略模式。今天我講前面五種。

2、首先是工廠模式和單例模式,都是創建型模式。工廠模式有一個定義:Define an interface for creating an Object, but let subclass to decide which class to instantiate. Spring中的ApplicationContext應用上下裝載bean的定義和組裝,Spring自帶了多種類型的應用上下文,而創建應用上下文的時候就用到了工廠模式:






上面三種模式都創建了應用上下文,接下來通過看ClassPathXmlApplication的源碼,具體看一下工廠模式:









通過以上重重查找最終查到了ApplicationContext這個接口上,通過這個接口繼承的類也發現其實應用上下文也是完成BeanFactory的功能。其他類型的應用上下文的源碼也大抵是這個樣子,大家可以自己去查看。其實我們自己自學的工廠模式都是簡單的,而實際運用都是很複雜的,沒繼承一個類或實現一個接口都是有一定的用意。

3、接下來看一下單例模式。直接看源碼:
首先看一下AbstracBeanFactory源碼中getBean的doGetBean方法:




getBean的doGetBean方法調用的getSingleton進行bean的創建:



Bean的創建默認是單例的,當然也是可以設置爲非單例。可以看出使用雙重判斷加鎖的單例模式。首先從緩存中獲取bean實例,如果爲null就對緩存map加鎖,然後再取一次,如果繼續爲null,就創建一個bean。這樣雙重判斷能避免在加鎖瞬間,有其他依賴注入引發bean實例創建,從而重複創建的結果。

在這裏spring並沒有使用私有構造器方法來創建bean,而是通過getObject來創建bean。感興趣的話可以繼續跟蹤下去,這也更證明了理論知識是死的,應用的人是活的。

4、代理模式:Spring中使用兩種代理模式方式:一種是jdk的java.lang.reflect.Proxy類代理,另外一種是CGLIB庫生成目標對象的子類。

Spring AOP是經典代理的表示,而在看書中關於的AOP都是基於註解的,實際應用這個切面也是通過@Aspect,以及通知的幾種註解。

5、適配器模式:剛纔有提到通知,spring的通知類型有:BeforeAdvice、AfterReturningAdvice和ThrowsAdvice。這三種通知類型實際上是藉助適配器模式來實現的。現在來看一下BeforeAdvice適配器:

適配器的作用是擴展

這個相當於目標(Target),是適配器的接口


相當於Adapter


這個就是客戶端


6、模板模式:Spring將數據訪問過程中固定的和可變的部分劃分爲兩個不同的類:模板(template)和回調(callback)。模板管理過程中固定的部分,而回調處理自定義的數據訪問代碼。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章