在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所示。
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.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所示。圖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)方法來完成操作。
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ì)能提供一些思路。