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

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

1.Spring框架簡(jiǎn)介

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

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

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

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

2.1工廠模式(Factory pattern)

(1)定義

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

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

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

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

2.2代理模式(Proxy pattern)

(1)定義

代理模式為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。代理模式由抽象角色、代理角色和真實(shí)角色三種角色組成。

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

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

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

2.3策略模式(Strategy pattern)

(1)定義

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

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

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

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

3.總結(jié)

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

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

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

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

友情鏈接更多精彩內(nèi)容