Spring框架設(shè)計模式分析

在Java web的開發(fā)過程中滩字,目前企業(yè)級應(yīng)用程序采用較多的開發(fā)框架是SSH(Spring+SpringMVC+Hibernate僧界,用SpringMVC來代替Struts)服赎。本文通過閱讀Spring的官方手冊和源代碼來分析Spring創(chuàng)建者的設(shè)計理念,主要梳理在使用Spring的過程中遇到的設(shè)計模式闪唆,以及Spring框架中各個核心組件之間的協(xié)同方式碧库。

1.Spring框架簡介

Spring框架是目前最流行的企業(yè)級開發(fā)框架之一柜与,由Rod Johnson創(chuàng)建。Spring作為現(xiàn)在主流的企業(yè)級應(yīng)用開發(fā)框架嵌灰,創(chuàng)建的主要目的是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性弄匕,對一些常用的企業(yè)級API提供一致的模型封裝。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情沽瞭,通過輕量級的容器來取代傳統(tǒng)的EJB粘茄,簡化企業(yè)應(yīng)用的開發(fā)難度。Spring框架是一個分層架構(gòu),由7個定義良好的模塊組成柒瓣。Spring模塊構(gòu)建在核心容器之上儒搭,核心容器定義了創(chuàng)建、配置和管理bean的方式芙贫,Spring框架的架構(gòu)模式如圖1所示搂鲫。

圖1 spring framework構(gòu)架模式

2.Spring框架中設(shè)計模式的應(yīng)用

Spring框架由多個模塊組成,每個模塊都有其特定的功能磺平。各模塊可以單獨存在魂仍,也可以和其他一個或多個模塊組合實現(xiàn)。為了實現(xiàn)各個模塊的功能拣挪,創(chuàng)建者在設(shè)計Spring的時候采用了多種設(shè)計模式擦酌,下面文章中主要分析Spring框架中相對比較重要的幾個模塊所采用的實際模式。

2.1工廠模式(Factory pattern)

(1)定義

工廠模式是GOF23中設(shè)計模式之一菠劝,屬于創(chuàng)建模式的一種赊舶。工廠模式可將Java對象的調(diào)用者從被調(diào)用者的實現(xiàn)邏輯中分離出來,調(diào)用者只需關(guān)心被調(diào)用者必須滿足的規(guī)則(接口)赶诊,而不必關(guān)心實例的具體實現(xiàn)過程笼平。工廠模式由抽象產(chǎn)品(接口)、具體產(chǎn)品(實現(xiàn)類)舔痪、生產(chǎn)者(工廠類)三種角色組成寓调。

(2)Spring中對工廠模式的應(yīng)用

Spring中在各種BeanFactory以及ApplicationContext創(chuàng)建中都用到了典型的工廠方法模式,BeanFactory的設(shè)計原理如圖2所示锄码。Spring Bean的體系結(jié)構(gòu)比較復(fù)雜夺英,頂級接口是BeanFactory;BeanFactory共有三個子接口:ListableBeanFactory滋捶、HierarchicalBeanFactory和AutowireCapableBeanFactory痛悯,這三個子接口集成了頂級接口并對BeanFactory的功能進行了增強,稱為二級接口炬太;ConfigurableBeanFactory對二級接口HierarchicalBeanFactory進行了再次增強,它還繼承了另一個外來的接口SingletonBeanRegistry驯耻,可以被稱為三級接口亲族;ConfigurableListableBeanFactory是一個更強大的接口,繼承了上述的所有接口可缚,稱為四級接口霎迫。其余的為抽象類,實現(xiàn)了Spring Bean四級接口所定義的所有功能帘靡。

圖2 BeanFactory的設(shè)計原理

2.2代理模式(Proxy pattern)

(1)定義

代理模式為其他對象提供一種代理以控制對這個對象的訪問知给。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用涩赢。代理模式由抽象角色戈次、代理角色和真實角色三種角色組成。

(2)Spring中代理模式的應(yīng)用

Spring的Proxy模式主要在Aop的實現(xiàn)中有體現(xiàn)筒扒,比如JdkDynamicAopProxy和Cglib2AopProxy怯邪,用到了JDK的動態(tài)代理模式。Spring中使用代理模式的結(jié)構(gòu)如圖3所示花墩。
Spring使用代理模式的結(jié)構(gòu)

圖3 Spring使用代理模式的結(jié)構(gòu)$Proxy是創(chuàng)建的代理對象悬秉,Subject是抽象主題,代理對象是通過InvocationHandler來持有對目標對象的引用冰蘑。除了實現(xiàn)被代理對象的接口外和泌,還會有org.springframework.aop.SpringProxy和org.springframework.aop.framework.Advised兩個接口。

2.3策略模式(Strategy pattern)

(1)定義

策略模式定義一系列的算法祠肥,把它們一個個封裝起來武氓,并且使它們可相互替換,使得算法可獨立于使用它的客戶而變化搪柑。策略模式由抽象策略角色聋丝、具體策略角色和環(huán)境角色三種角色組成。

(2)Spring中策略模式的應(yīng)用

Spring中在實例化對象的時候用到Strategy模式工碾,結(jié)構(gòu)如圖4所示弱睦。Spring中抽象策略實現(xiàn)的核心是AopProxy接口;Cglib2AopProxy和JdkDynamicAopProxy集成了核心接口渊额,分別代表兩種策略的實現(xiàn)方式况木;ProxyFactoryBean代表Spring中的Context角色僚稿,它根據(jù)條件選擇使用Jdk代理方式或者是CGLIB方式陶贼;而另外三個類主要是來負責創(chuàng)建具體策略對象;ProxyFactoryBean是通過依賴的方法來關(guān)聯(lián)具體策略對象的累贤,它是通過調(diào)用策略對象的getProxy(ClassLoader classLoader)方法來完成操作奔垦。

圖4 Spring策略模式結(jié)構(gòu)示意圖

3.總結(jié)

本文通過從Spring的幾個核心組件入手屹耐,試圖找出構(gòu)建Spring框架的骨骼架構(gòu),進而分析Spring在設(shè)計過程中的一些設(shè)計理念椿猎。主要分析了Spring構(gòu)架和實現(xiàn)中所應(yīng)用的工廠模式惶岭、代理模式和策略模式,從中學(xué)習(xí)到Spring作者的設(shè)計思想犯眠,對我們以后程序設(shè)計能提供一些思路按灶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筐咧,隨后出現(xiàn)的幾起案子鸯旁,更是在濱河造成了極大的恐慌噪矛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铺罢,死亡現(xiàn)場離奇詭異艇挨,居然都是意外死亡,警方通過查閱死者的電腦和手機畏铆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門雷袋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辞居,你說我怎么就攤上這事楷怒。” “怎么了瓦灶?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵鸠删,是天一觀的道長。 經(jīng)常有香客問我贼陶,道長刃泡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任碉怔,我火速辦了婚禮烘贴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撮胧。我一直安慰自己桨踪,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布芹啥。 她就那樣靜靜地躺著锻离,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墓怀。 梳的紋絲不亂的頭發(fā)上汽纠,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音傀履,去河邊找鬼虱朵。 笑死,一個胖子當著我的面吹牛钓账,可吹牛的內(nèi)容都是我干的碴犬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼官扣,長吁一口氣:“原來是場噩夢啊……” “哼翅敌!你這毒婦竟也來了羞福?” 一聲冷哼從身側(cè)響起惕蹄,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卖陵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遭顶,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年泪蔫,在試婚紗的時候發(fā)現(xiàn)自己被綠了棒旗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撩荣,死狀恐怖铣揉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情餐曹,我是刑警寧澤逛拱,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站台猴,受9級特大地震影響朽合,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饱狂,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一曹步、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧休讳,春花似錦讲婚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婆咸,卻和暖如春竹捉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尚骄。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工块差, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倔丈。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓憨闰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親需五。 傳聞我的和親對象是個殘疾皇子鹉动,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)宏邮,斷路器泽示,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,804評論 6 342
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架缸血。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,461評論 1 133
  • 嶺南,湘北械筛,洞庭湖…… 我的翅膀飛過一重重山捎泻,一道道水 我赤裸的胴體只為沐浴家鄉(xiāng)的河 我饑渴的心靈只為喝一口母親的...
    海羅閱讀 553評論 2 3
  • 前些天笆豁,作為家長參加了孩子小學(xué)的首次家長會。會上的宣講老師提到赤赊,多年前流行“學(xué)會數(shù)理化闯狱,走遍天下都不怕”。現(xiàn)如今抛计,...
    伯涵子弟閱讀 815評論 0 5