一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

基于Spring框架的WebSphere應(yīng)用開發(fā)

 im056 2008-03-11

基于Spring框架的WebSphere應(yīng)用開發(fā)

級別: 初級

偉 方國 (fangguow@cn.ibm.com), IBM軟件部工程師

2006 年 3 月 13 日

本文首先介紹使用Spring開發(fā)Web應(yīng)用的基本問題,然后結(jié)合WebSphere應(yīng)用服務(wù)器,講述Spring應(yīng)用如何結(jié)合容器提供的服務(wù)。

概覽

輕量級的企業(yè)應(yīng)用開發(fā)越來越受到廣大J2EE應(yīng)用開發(fā)者的追捧,而Spring框架又是輕量級容器的杰出代表。由于Spring的使用日漸廣泛,因此已有許多基于WebSphere應(yīng)用服務(wù)器(WAS)的應(yīng)用采用了Spring框架。本文首先介紹使用Spring開發(fā)Web應(yīng)用的基本問題,然后結(jié)合WebSphere應(yīng)用服務(wù)器,講述Spring應(yīng)用如何結(jié)合容器提供的服務(wù)。文章目的是與大家一起探討如何更好的采用Spring框架開發(fā)基于WebSphere應(yīng)用服務(wù)器的應(yīng)用。





1.1 Spring框架的主要思想描述

Spring框架的核心思想我們可以用兩個字來描述,那就是"解耦"。應(yīng)用程序的各個部分之間(包括代碼內(nèi)部和代碼與平臺之間)盡量形成一種松耦合的結(jié)構(gòu),使得應(yīng)用程序有更多的靈活性。應(yīng)用內(nèi)部的解耦主要通過一種稱為控制反轉(zhuǎn)(IOC)的技術(shù)來實現(xiàn)??刂品崔D(zhuǎn)的基本思想就是本來由應(yīng)用程序本身來主動控制的調(diào)用等邏輯轉(zhuǎn)變成由外部配置文件來被動控制。通常我們用一個所謂的好萊塢原則(Don't call me. I will call you.)來比喻這種控制反轉(zhuǎn)的關(guān)系。由于控制反轉(zhuǎn)的概念相對比較廣泛,很多應(yīng)用服務(wù)器實際上也實現(xiàn)了不同程度的控制反轉(zhuǎn)技術(shù),只是這些應(yīng)用服務(wù)器對應(yīng)用程序的侵入性太強。因此Martin Fowler專門寫了一篇文章討論控制反轉(zhuǎn)這個概念,并提出一個描述更為準(zhǔn)確的概念,叫依賴注入(Dependency Injection)。關(guān)于依賴注入具體可以參考Martin Fowler原文,見參考資料1。Spring框架中的各個部分都充分使用了這種依賴注入的技術(shù)實現(xiàn),從而給應(yīng)用以最大的靈活度。實際上,這種依賴注入的參數(shù)化應(yīng)用控制并不是Spring的首創(chuàng),比如IBM的多渠道應(yīng)用整合平臺(Branch Transformation Toolkit,BTT)很早就采用了這種外部參數(shù)化控制的技術(shù)。BTT中的"對象工廠"與Spring框架中的BeanFactory也有著異曲同工之妙。

Spring框架另外一個比較重要的技術(shù)是它對于面向切面的編程(AOP)的支持。隨著應(yīng)用復(fù)雜度的逐漸上升和對應(yīng)用靈活性要求的提高,IT邏輯和業(yè)務(wù)邏輯盡量分離的呼聲也越來越高。AOP技術(shù)作為實現(xiàn)這種分離的一種比較好的途徑而越來越受到大家的重視。Spring提供的是一種動態(tài)AOP實現(xiàn),也即通過代理模式動態(tài)地在目標(biāo)對象的方法前后插入相應(yīng)的處理代碼。應(yīng)用程序與底層應(yīng)用服務(wù)器平臺的解耦也可以借助AOP技術(shù)來實現(xiàn)。Spring內(nèi)置的AOP支持是一種錦上添花的功能。它使得一些本來必須由容器支持的功能,比如事務(wù)控制可以脫離開容器運行,從而達(dá)到"瘦身"的目的。這也是為什么Spring框架常被人成為輕量級容器的一個原因。

Spring框架可以與許多已有的框架技術(shù)結(jié)合使用。J2EE技術(shù)應(yīng)用的一個重要特點是相關(guān)的開源社區(qū)非?;钴S。Web應(yīng)用的不同層次都有非常多優(yōu)秀的開源框架存在。比如Web層的Struts,OR映射層的Hibernate等。Spring框架并不重新發(fā)明輪子,它的出現(xiàn)不是為了替代這些已有的框架。相反,Spring框架在設(shè)計上可以獨立構(gòu)建應(yīng)用或者結(jié)合已有的框架一起構(gòu)建應(yīng)用。另外一個值得指出的地方是Spring框架的幾大模塊之間相互耦合度很小,因此Spring框架的使用可以根據(jù)實際需要選其部分模塊循序漸進的使用,而非必須統(tǒng)統(tǒng)照搬。






1.2 基于Spring的Web應(yīng)用基礎(chǔ)

1.2.1 Web應(yīng)用的典型層次

Web應(yīng)用一般在邏輯上根據(jù)功能分為以下幾層:

1. 展示層

這一層主要如何生成展示給最終用戶的界面,盡可能少的包含業(yè)務(wù)邏輯處理。對于基于J2EE的Web應(yīng)用,JSP是其最為常見的一種技術(shù)。Spring對于展示層的支持非常靈活,除了直接支持JSP之外,它還支持基于FreeMarker模板,基于Velocity模板或其它文檔類型的界面等的表現(xiàn)層實現(xiàn)。

2. 業(yè)務(wù)層

業(yè)務(wù)層一般包含主要的業(yè)務(wù)邏輯,尤其是與用例相對應(yīng)的那些業(yè)務(wù)邏輯。另外,這一層也適合包含事務(wù)管理和安全控制方面的邏輯。良好的業(yè)務(wù)層設(shè)計可以使得展示層可以采用不同的技術(shù)而不影響業(yè)務(wù)層。業(yè)務(wù)層的功能上可以類比于J2EE技術(shù)中的無狀態(tài)會話BEAN層次。

3. 數(shù)據(jù)訪問對象(DAO)接口層

DAO實際上就是數(shù)據(jù)接口層,在應(yīng)用中建議通過接口來體現(xiàn)。DAO的存在使得數(shù)據(jù)訪問可以與底層持久化層的具體實現(xiàn)相分離。一般在DAO接口中主要就是實現(xiàn)數(shù)據(jù)對象的查詢、存儲、刪除等操作。從理論上講,DAO層與底層數(shù)據(jù)的存儲方式是獨立的,也就是說并不一定要求是關(guān)系型數(shù)據(jù)庫。Spring框架在設(shè)計的時候也考慮到了其它非關(guān)系型數(shù)據(jù)庫數(shù)據(jù)源的情況。

4. 持久業(yè)務(wù)對象

持久業(yè)務(wù)對象是問題域中業(yè)務(wù)對象的持久化表示,比如一個用戶對象,一個銀行帳戶等。我們一般通過某種O/R映射技術(shù)來實現(xiàn)這些業(yè)務(wù)對象的持久化。持久業(yè)務(wù)對象是可以包含業(yè)務(wù)邏輯的,與業(yè)務(wù)層所包含的業(yè)務(wù)邏輯不同的地方是持久業(yè)務(wù)對象所包含的是與具體業(yè)務(wù)對象直接相關(guān)且更為通用的業(yè)務(wù)邏輯。

5. 企業(yè)信息系統(tǒng)

企業(yè)信息系統(tǒng)泛指Web應(yīng)用需要連接的后臺系統(tǒng),一般可以分為三大類,即ERP系統(tǒng),企業(yè)傳統(tǒng)的遺留系統(tǒng)和關(guān)系型數(shù)據(jù)庫。大部分Web應(yīng)用都是基于關(guān)系型數(shù)據(jù)庫的,這也是像Spring等常見框架所主要考慮的企業(yè)信息系統(tǒng)。

設(shè)計良好的Web應(yīng)用在層次一般是上一層依賴下一層,但是下一層不依賴上一層。我們可以暫時概括為"向下而不向上依賴原則"。為了使得不同層次之間的依賴降到最低,建議使用接口耦合。這一點又是Spring框架發(fā)揮它外部配置優(yōu)勢的地方。

1.2.2 MVC的選擇

雖然說MVC這種模式早在Java語言出現(xiàn)前就有了,但是這種模式在J2EE時代才大行其道,為廣大Web應(yīng)用開發(fā)者所接受。對于各種基于MVC的框架而言,其要解決的問題主要可以分為以下幾部分:

1. 將Web頁面中的輸入封裝成一個數(shù)據(jù)對象,比如像Struts的表單BEAN,Spring MVC中的命令類等。

2. 根據(jù)請求的不同,由負(fù)責(zé)分發(fā)的控制器來映射和調(diào)用相應(yīng)的邏輯處理單元,并將上面的數(shù)據(jù)對象作為參數(shù)傳入。

3. 邏輯處理單元完成相應(yīng)的處理之后又把結(jié)果放入一個數(shù)據(jù)對象。

4. 在選擇的展現(xiàn)界面中把返回的數(shù)據(jù)對象通過某種方式顯示出來。

在使用Spring構(gòu)建MVC的時候,可以選擇直接使用Spring自己的MVC實現(xiàn),或者利用Spring對已有的一些MVC框架的支持。比如Spring可以支持Struts,WebWork等,與它們結(jié)合使用。Spring引以為傲的非侵入的特性在Spring MVC上表現(xiàn)得并不如人意。它與Servlet API的耦合度較其它部分高,而且需要使用一些Spring的接口和類。

Spring MVC的主要分發(fā)器實現(xiàn)是org.springframework.web.servlet.DispatcherServlet,這是Spring MVC的訪問入口。Spring提供SimpleFormController,AbstractCommandController等類來幫助應(yīng)用構(gòu)建各種控制器動作,并用ModelAndView類來聯(lián)系展示和邏輯返回數(shù)據(jù)。如上節(jié)所述,Spring MVC能夠支持不同的界面展示技術(shù),而且界面的展示和其后面控制器的實現(xiàn)是分離的,也即界面展示技術(shù)的變化不用修改控制器的實現(xiàn),只需要利用Spring的控制反轉(zhuǎn)技術(shù)修改外部配置文件即可。比如,在使用JSP展示技術(shù)時,外部配置文件的viewResolver定義如下:


<bean id="viewResolver"
                        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                        <property name="viewClass">
                        <value>org.springframework.web.servlet.view.JstlView</value>
                        </property>
                        <property name="prefix"><value>/view/</value></property>
                        <property name="suffix"><value>.jsp</value></property>
                        </bean>
                        

如果切換到FreeMaker模板技術(shù),那么除了頁面模板的修改之外,主要就是把對應(yīng)的外部配置文件更改一下即可,如下所示。具體的展示邏輯部分不用做什么修改。


<bean id="viewResolver"
                        class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
                        <property name="viewClass">
                        <value>
                        org.springframework.web.servlet.view.freemarker.FreeMarkerView
                        </value>
                        </property>
                        <property name="suffix"><value>.ftl</value></property>
                        </bean>
                        <bean id="freemarkerConfig"
                        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
                        <property name="templateLoaderPath">
                        <value>/view/</value>
                        </property>
                        </bean>
                        

如果不使用Spring的MVC框架而想結(jié)合已有的一些MVC框架,Spring也是支持的。Spring對于常見的MVC框架都提供了支持,包括Struts,WebWork,Tapestry和JSF等。結(jié)合使用這些框架的一個好處是可以使用一些已有的熟悉的技術(shù),另外結(jié)合Spring的AOP攔截器可以相對比較容易地處理框架動作共有的事情,比如動作的日志處理等。如果選擇這些MVC框架,那么在使用框架的配置文件和應(yīng)用的Spring配置文件都需要做相應(yīng)的修改。比如使用Struts的時候,Struts-config.xml配置文件中的映射動作類型一般會設(shè)置成org.springframework.web.struts.DelegatingActionProxy,或者設(shè)置控制器為org.springframework.web.struts.DelegatingRequestProcessor。然后需要在相應(yīng)應(yīng)的WebApplicationContext中定義與Struts Action對應(yīng)的Bean。這樣就可以充分利用Spring的控制反轉(zhuǎn)技術(shù)來管理Struts的Action了。

另外在使用這些框架的時候要解決的一個問題是上下文的裝載。比如使用Struts,可以使用ContextLoaderPlugin來裝載Web上下文。這個ContextLoaderPlugin替換了原來通過DispacherServlet裝載的方式。需要在struts-config.xml文件中添加如下條目:<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>。這種方式可以使Spring的Web上下文隨著Struts ActionServlet的初始化而裝載。

因此,如果用戶已有的應(yīng)用是基于某個MVC框架,或者用戶熟悉某個框架,那么可以利用Spring對這些框架的支持結(jié)合使用。因為我們的目的本來就是為了解決問題而不是為了使用某種技術(shù)。但是對其它用戶而言,如果不是對已有的一些MVC框架比較熟悉的話,那就直接使用Spring的MVC框架就可以了。

1.2.3 Web Context設(shè)置

對于不依賴于應(yīng)用服務(wù)器的Spring 上下文(Context)設(shè)置,通常在應(yīng)用代碼中通過FileSystemXmlApplicationContext或ClasspathXmlApplicationContext來獲取。比如使用這樣的代碼來得到上下文:


ApplicationContext ctx = new FileSystemXmlApplicationContext("config.xml");
                        

但是按照控制反轉(zhuǎn)的原則,應(yīng)用程序代碼應(yīng)該盡可能少的知道上下文的設(shè)置。因此,在基于Spring的Web應(yīng)用中,這樣的代碼也可以省去。Spring可以通過配置讓W(xué)eb容器自動裝載上下文配置文件。從本質(zhì)上講,Web應(yīng)用的ServletContext就是Spring用來存放應(yīng)用上下文的地方。Spring中與Web Context裝載相關(guān)的有幾個類:

1. ContextLoaderListener:一般的應(yīng)用服務(wù)器如WAS都能先裝載Listener,如果不是的話,那么只能使用ContextLoaderServlet。

2. ContextLoaderServlet:需要配置<load-on-startup>使得它率先裝載。真正裝載Context的類是ContextLoader,上面兩個類只是兩種調(diào)用ContextLoader的不同途徑。ContextLoader內(nèi)部實際調(diào)用的是XmlWebApplicationContext,其缺省配置文件為/WEB-INF/applicationContext.xml。

如果使用ContextLoaderListener,其在web.xml中的配置一般如下:


<listener>
                        <listener-class>
                        org.springframework.web.context.ContextLoaderListener
                        </listener-class>
                        </listener>
                        

如果使用ContextLoaderServlet,其在web.xml中的配置一般如下:


<servlet>
                        <servlet-name>context</servlet-name>
                        <servlet-class>
                        org.springframework.web.context.ContextLoaderServlet
                        </servlet-class>
                        <load-on-startup>1</load-on-startup>
                        </servlet>
                        

應(yīng)用本身可能除了基于HTTP的Web渠道之外還通過別的渠道對外提供服務(wù),因此,一個比較好的做法是把展示相關(guān)的配置與后面業(yè)務(wù)處理部分的配置分開。這樣如果更改了應(yīng)用的訪問渠道,只需要修改對應(yīng)的配置文件即可。因此,Spring提供了一個WebApplicationContext的概念。在WebApplicationContext中一般包含與Web訪問相關(guān)的配置定義,包括各種控制動作的定義、界面展示的定義等等。WebApplicationContext一般由DispatcherServlet來初始化。在上下文層次結(jié)構(gòu)上可以把它看成是ApplcationContext的子上下文。在缺省的情況下,DispatcherServlet裝載的配置文件名稱為其Servlet名稱-Servlet.xml,但是可以通過contextConfigLocation參數(shù)來定制。DispatcherServlet在web.xml中的定義示例如下:


<servlet>
                        <servlet-name>Dispatcher</servlet-name>
                        <servlet-class>
                        org.springframework.web.servlet.DispatcherServlet
                        </servlet-class>
                        <load-on-startup>2</load-on-startup>
                        </servlet>
                        <init-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>/WEB-INF/context/Webcontrollers.xml</param-value>
                        </init-param>
                        

1.2.4 數(shù)據(jù)持久化層

雖然使用J2EE技術(shù)的Web應(yīng)用可以連接多種不同的企業(yè)信息系統(tǒng)(EIS),但是毫無疑問數(shù)據(jù)庫是其中最為重要和常見的一種。正因如此,Spring對數(shù)據(jù)庫訪問提供了非常完備的支持。數(shù)據(jù)訪問對象(DAO)模式是J2EE模式中非常重要的一種。它的主要目的是使得持久化層與業(yè)務(wù)邏輯層分離,從而屏蔽持久化層的具體實現(xiàn)。我們可以把Spring的DAO支持分為兩大類,一是直接基于Spring JDBC模板的數(shù)據(jù)訪問,另一類是基于某種O/R映射框架的數(shù)據(jù)訪問。這里剛好可以使用Spring的控制反轉(zhuǎn)特性,通過外部配置文件來定義DAO接口和實際實現(xiàn)類之間的關(guān)系。Spring框架目前支持的O/R映射框架包括Hibernate、JDO、TopLink、iBATIS等。

假設(shè)我們定義了一個userDAO。當(dāng)使用JDBC來實現(xiàn)這個DAO的時候,定義的類可以如下所示:


public class userDAOJDBC extends JdbcDaoSupport implements userDAO{	…	}
                        

如果使用Hibernate來實現(xiàn)這個DAO的時候,定義的類如下:


public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO { … }
                        

Spring對于其它的O/R映射機制都有相應(yīng)的抽象類供應(yīng)用使用,比如對于iBATIS有SqlMapClientDaoSupport,對于JDO有JdoDaoSupport等。

下面我們看一下如何在Spring的配置文件中定義上述DAO與具體實現(xiàn)的關(guān)系。假設(shè)我們的userDAO具體實現(xiàn)是通過Hibernate,那么在applicationContext.xml中的一個DAO可以定義如下:


<bean id="userDAO"	class="com.fgw.dao.hibernate.UserDAOHibernate">
                        <property name="sessionFactory">
                        <ref local="sessionFactory"/>
                        </property>
                        </bean>
                        

在這里我們實際DAO接口定義是:com.fgw.dao.UserDAO,而具體實現(xiàn)類為:com.fgw.dao.hibernate.UserDAOHibernate。顯然,對于其它DAO的實現(xiàn),我們只需要在配置文件中修改相應(yīng)的實現(xiàn)類(具體實現(xiàn)類當(dāng)然是比不可少的)和屬性即可。比如對于JDBC的DAO實現(xiàn),屬性就定義成相應(yīng)的數(shù)據(jù)源。





1.3 Spring與WebSphere應(yīng)用服務(wù)器的配合

Spring與底層J2EE應(yīng)用服務(wù)器還是存在一些需要結(jié)合的地方,這里給出WAS中的一些結(jié)合點。

1.3.1 使用WAS數(shù)據(jù)源

在Java應(yīng)用程序中,數(shù)據(jù)庫的連接一般有兩種方式來得到。一種是通過java.sql.DriverManager的方式來得到數(shù)據(jù)庫連接。這種方式不依賴于應(yīng)用服務(wù)的支持,但是也不提供數(shù)據(jù)庫連接池的功能。另外一種方式是通過javax.sql.DataSource的方式來得到數(shù)據(jù)庫連接。在傳統(tǒng)基于J2EE的應(yīng)用需要通過JNDI來得到數(shù)據(jù)源(javax.sql.DataSource)對象,然后再通過數(shù)據(jù)源來得到相應(yīng)的數(shù)據(jù)庫連接。常見的應(yīng)用服務(wù)器都支持這種方式,且一般都提供了數(shù)據(jù)庫連接池的支持。雖然說我們一般推薦使用數(shù)據(jù)庫連接池,但是也有一些時候我們需要脫離開應(yīng)用服務(wù)器的環(huán)境使用數(shù)據(jù)庫(比如單元測試,比如應(yīng)用移植等)。然而應(yīng)用程序使用這兩種方式的時候代碼是不一樣的,因此只能通過代碼來應(yīng)變。Spring提供了一個統(tǒng)一使用數(shù)據(jù)源的解決方案,然后通過控制反轉(zhuǎn)的機制用外部配置文件來指定使用的數(shù)據(jù)源。這樣一方面可以統(tǒng)一這兩種得到數(shù)據(jù)庫連接的方式,另一方面也不需要像通常的J2EE應(yīng)用通過繁瑣的JNDI代碼來得到數(shù)據(jù)源。這樣應(yīng)用程序也就不需要知道使用的何種數(shù)據(jù)源。

Spring提供了一個DriverManagerDataSource類來統(tǒng)一第一種方式的數(shù)據(jù)源獲取。如果使用WAS中的Cloudscape數(shù)據(jù)庫,用外部配置文件可配置如下:


<bean id="dataSource"	class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                        <property name="driverClassName">
                        <value>com.ibm.db2j.jdbc.DB2jDriver</value>
                        </property>
                        <property name="url">
                        <value>jdbc:db2j:D:\\DBName</value>
                        </property>
                        </bean>
                        

Spring提供了JndiObjectFactoryBean類來支持第二種方式的數(shù)據(jù)源獲取。假設(shè)WAS中已經(jīng)配置好的數(shù)據(jù)源名稱為jdbc /MyDB,那么用外部配置文件可配置如下:


<bean id="dataSource"
                        class="org.springframework.jndi.JndiObjectFactoryBean">
                        <property name="jndiName"><value>java:comp/env/jdbc/MyDB</value></property>
                        </bean>
                        或者
                        <bean id="dataSource"
                        class="org.springframework.jndi.JndiObjectFactoryBean">
                        <property name="jndiName"><value>jdbc/MyDB</value></property>
                        <property name="resourceRef"><value>true</value></property>
                        </bean>
                        

從上面配置我們可以得知,通過使用Spring,應(yīng)用程序能夠統(tǒng)一使用不同的數(shù)據(jù)源實現(xiàn)。如果使用環(huán)境發(fā)生變化,那么只需要修改Spring的配置文件即可。對于部署在WAS上的Web應(yīng)用,在生產(chǎn)環(huán)境中推薦使用WAS實現(xiàn)的數(shù)據(jù)庫連接池。一方面是因為連接池實現(xiàn)地比較完善。另一方面,使用WAS提供的數(shù)據(jù)庫連接池可以很完善地支持JTA事務(wù)。

1.3.2 使用WAS的JTA

Web應(yīng)用程序在使用事務(wù)的時候常常會涉及一個事務(wù)類型的選擇。是選擇像JDBC事務(wù)這樣的本地事務(wù)呢還是使用JTA支持的全局事務(wù)。這個與應(yīng)用程序需要涉及到的事務(wù)管理器類型和個數(shù)密切相關(guān)。Spring本身不支持分布式事務(wù),因此分布式事務(wù)需要底層的JTA。但是Spring提供了事務(wù)的抽象,即底層真正事務(wù)實現(xiàn)可以切換而不影響應(yīng)用程序代碼。這樣應(yīng)用程序可以依賴于底層WAS,也可以輕易地脫離開應(yīng)用服務(wù)器的環(huán)境。這一點與前面數(shù)據(jù)源的抽象非常類似。

WAS本身對于事務(wù)劃分有兩種支持方式,一種是聲明式的,當(dāng)然這種管理方式需要EJB容器的支持,即所謂的容器管理事務(wù)(CMT)。另外一種方式是編程式的,通過程序代碼來直接使用JTA編程接口。Spring對于事務(wù)的劃分也可以分為聲明式和編程式兩種方式。對于Spring編程式的事務(wù)劃分方式,總體上可以分為兩大類。一類是通過直接使用實現(xiàn)PlatformTransactionManager接口的類。另一類是通過使用TransactionTemplate模板類,模板類的使用可以簡化事務(wù)控制代碼。Spring對于聲明式事務(wù)劃分的支持實際上是利用了它的AOP機制。相對于編程式事務(wù)劃分,這種基于AOP的方式比較靈活,而且對代碼的侵入性幾乎為零。因此,如果沒有特殊需要推薦使用這種事務(wù)劃分方式?;贏OP的常用事務(wù)劃分方式可以使用ProxyFactoryBean加TransactionInterceptor方式,或者使用TransactionPorxyFactoryBean的方式。前一種方式相對比較靈活,而后一種則對使用相對比較簡單。

無論是哪一種事務(wù)劃分方式,底層都需要一個事務(wù)管理機制作為支撐。如果是單一的事務(wù)資源管理器,那么根據(jù)所使用的后臺事務(wù)管理資源不同的類型,可以選擇的PlatformTransactionManager實現(xiàn)有DataSourceTransactionManager,HibernateTransactionManager, JdoTransactionManager, PersistenceBrokerTransactionManager,和JmsTransactionManager等。無論是單個還是多個事務(wù)資源管理器,都可以使用JtaTransactionManager類。如果使用JtaTransactionManager,那么所有事務(wù)管理實際都會委托給底層應(yīng)用服務(wù)器的JTA實現(xiàn)。

例如,如果使用JDBC或iBATIS,那么我們可以使用簡單的DataSourceTransactionManager,外部配置文件片斷如下:


	<bean id="transactionManager"
                        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                        <property name="dataSource">
                        <ref local="dataSource" />
                        </property>
                        </bean>
                        

如果使用Hibernate,那么我們可以使用HibernateTransactionManager,外部配置文件片斷如下:


<bean id="transactionManager" class="org.springframework.orm.hibernate.
                        HibernateTransactionManager">
                        <property name="sessionFactory"><ref local="sessionFactory"/></property>
                        </bean>
                        

使用WAS的JTA支持,我們只需要把上述對應(yīng)bean中的class屬性改成class屬性改為org.springframework.transaction.jta.JtaTransactionManager,然后再把屬性改為WebSphere對應(yīng)的TransactionManager,參考如下:


<bean id="wasTxMgr"
                        class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/>
                        <bean id="transactionManager"
                        class="org.springframework.transaction.jta.JtaTransactionManager">
                        <property name="transactionManager">
                        <ref local="wasTxMgr"/>
                        </property>
                        </bean>
                        

通過采用Spring的事務(wù)支持,底層事務(wù)采用何種方式的決定就不必在一開始開發(fā)就做出決定。因為我們能夠通過Spring的外部配置文件來進行切換真正的事務(wù)支持。不過,雖然也有第三方的JTA支持,但是WAS能夠提供非常穩(wěn)定的XA支持,因此推薦使用WAS的JTA,尤其是當(dāng)應(yīng)用涉及到分布事務(wù)處理的時候。這樣無論應(yīng)用涉及幾個事務(wù)資源都可以統(tǒng)一解決。

1.3.3 如何加載Spring的JAR包

Spring框架的核心JAR包是spring.jar,但是根據(jù)實際使用情況需要一些擴展JAR包和依賴JAR包。那在WAS中如何處理這些JAR包文件呢?在Web應(yīng)用中一個簡單而直接的處理方式放是把這些使用到的JAR文件都拷貝到對應(yīng)的WEB-INF/lib目錄下面。這種方法雖然簡單,但是當(dāng)有多個Spring應(yīng)用程序的時候這種處理方式就需要在每個應(yīng)用的WEB-INF/lib目錄下都拷貝一份相同的JAR文件。這里可以通過共享庫的方式來統(tǒng)一解決類庫共享這個問題。

共享庫就是WAS專門用來解決不同應(yīng)用程序之間共享JAR或本地庫文件的一種機制。共享庫由一個名字、一個JAVA類路徑和/或一個裝載JNI庫本地庫路徑組成。它可以分別在單元,節(jié)點和服務(wù)器級別定義。但是共享庫定義了并不意味著它會被裝載,只有當(dāng)這個共享庫與某個應(yīng)用程序或應(yīng)用服務(wù)器關(guān)聯(lián)之后,它才會被加載。如果一個共享庫與一個應(yīng)用程序關(guān)聯(lián),那么這個共享庫由應(yīng)用程序類加載器加載。如果一個共享庫與應(yīng)用服務(wù)器關(guān)聯(lián),那么這個共享庫就需要一個專門定義的類加載器來加載。這個類加載器需要用戶自己定義。其操作如下:選應(yīng)用服務(wù)器比如server1'類加載器'新建一個類加載器'加載器與共享庫關(guān)聯(lián)。在創(chuàng)建這個類加載器之前一般都需要預(yù)先定義好共享庫。

根據(jù)上面的介紹可知,通過共享庫解決Spring應(yīng)用的JAR包共享問題,主要就是兩個步驟。一是,把Spring應(yīng)用中需要共享的JAR包定義成為一個共享庫。二是,選定相應(yīng)的WAS服務(wù)器實例,把它與上面創(chuàng)建的共享庫關(guān)聯(lián)起來。這樣此WAS服務(wù)器實例上的所有應(yīng)用都能夠使用共享庫中定義的JAR包。使用共享庫這種方式的時候要注意理解類的裝載次序和方式。如果是這種與WAS服務(wù)器實例關(guān)聯(lián)的共享庫JAR包,其類加載器在層次結(jié)構(gòu)上在應(yīng)用程序類加載器上面,即是它的父加載器。關(guān)于WAS的類裝載器結(jié)構(gòu)和策略可以進一步參考WAS信息中心。





1.4 結(jié)束語

Spring框架的核心內(nèi)容并不依賴于任何容器,但是顯然基于Web的應(yīng)用是Spring主要的應(yīng)用類型。了解和使用Spring框架一方面可以簡化應(yīng)用的開發(fā)和測試,另一方也可以加深對J2EE技術(shù)的理解。另外輕量級的Web應(yīng)用開發(fā)正在成為一種趨勢,因此何樂而不為之。上面所討論的只是Spring使用中常見的一些內(nèi)容,Spring框架自己也正變得越來越復(fù)雜。當(dāng)然,Spring、Hibernate等框架中體現(xiàn)的一些思想也正被JEE 5規(guī)范所借鑒,尤其是EJB 3中也有了控制反轉(zhuǎn)的應(yīng)用和POJO的大量使用。實際上無論是JEE技術(shù)標(biāo)準(zhǔn)還是Spring等框架,其目的都是如何簡化企業(yè)應(yīng)用的開發(fā),只是作為標(biāo)準(zhǔn),JEE要考慮的內(nèi)容更為廣泛一些,程度也更為深入一些。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    色婷婷中文字幕在线视频| 国产精品内射视频免费| 成人精品国产亚洲av久久 | 人妻少妇av中文字幕乱码高清| 亚洲一区二区三区中文久久| 中文日韩精品视频在线| 精品一区二区三区三级视频| 国产主播精品福利午夜二区| 中文字幕佐山爱一区二区免费| 亚洲最新一区二区三区| 欧美日韩视频中文字幕| 丰满人妻一二三区av| 成人午夜激情在线免费观看| 久热香蕉精品视频在线播放| 中文字幕日韩一区二区不卡| 欧美又黑又粗大又硬又爽| 久久99夜色精品噜噜亚洲av | 情一色一区二区三区四| 亚洲另类女同一二三区| 深夜视频成人在线观看| 国产又猛又黄又粗又爽无遮挡| 国产无摭挡又爽又色又刺激| 欧美午夜一级特黄大片| 久热青青草视频在线观看| 国产欧美性成人精品午夜| 久久久精品区二区三区| 欧美一区二区三区不卡高清视| 最近中文字幕高清中文字幕无| 九九热这里只有精品哦| 国产日韩久久精品一区| 亚洲欧洲一区二区中文字幕| 日本久久中文字幕免费| 国产伦精品一区二区三区高清版 | 开心久久综合激情五月天| 日韩精品在线观看一区| 日韩一级一片内射视频4k| 激情爱爱一区二区三区| 国产成人在线一区二区三区| 精品al亚洲麻豆一区| 日本亚洲精品在线观看| 黄色三级日本在线观看|