在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所示搂鲫。
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.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所示花墩。圖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)方法來完成操作奔垦。
3.總結(jié)
本文通過從Spring的幾個核心組件入手屹耐,試圖找出構(gòu)建Spring框架的骨骼架構(gòu),進而分析Spring在設(shè)計過程中的一些設(shè)計理念椿猎。主要分析了Spring構(gòu)架和實現(xiàn)中所應(yīng)用的工廠模式惶岭、代理模式和策略模式,從中學(xué)習(xí)到Spring作者的設(shè)計思想犯眠,對我們以后程序設(shè)計能提供一些思路按灶。