本文最后更新為2005-11-28
請以英文版本為準(zhǔn),謝謝.本文不可能實時更新.
本文大部分內(nèi)容來自http://wiki.opensymphony.com/display/WW/Spring,本文主要是把內(nèi)容翻譯過來并補充一下內(nèi)容,請以英文版本為準(zhǔn). :)
在WebWork2.2中,spring已經(jīng)作為IOC的支持基礎(chǔ),原有的Spring結(jié)合的方法已經(jīng)分別溶入到XWork和WebWork的源碼中.XWork的IoC將要被拋棄了.
當(dāng)然原有的組合辦法依然有效,一些類改了包名和類名,但是使用方法類似.
在WebWork2.2中,還有一種新的辦法來結(jié)合Spring.
開啟Spring組合
在WebWork中開啟Spring支持是非常簡單的,把最新版本的Spring的jar放到你的classpath中,然后在webwork.properties里面設(shè)置如下選項:
webwork.objectFactory = spring |
此時使用的類是: com.opensymphony.webwork.spring.WebWorkSpringObjectFactory,也可以指定為其他SpringObjectFactory.
缺省Spring的裝配策略是 by name,可以修改webwork.properties改為其他方式,例如type,name,auto等
這時所有對象都首先來用Spring來創(chuàng)建.如果Spring沒有創(chuàng)建這些對象,WebWork會自己創(chuàng)建這些對象. 然后,你需要在web.xml里面設(shè)置Spring的listener:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> |
Spring配置示例
這時,你可以添加一個標(biāo)準(zhǔn)的Spring配置文件:WEB-INF/applicationContext.xml,舉例如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="autodetect">
<bean id="personManager" class="com.acme.PersonManager"/>
...
</beans> |
使用Spring初始化Action
一般來說,你在xwork.xml里面為每個Action指定類.當(dāng)使用SpringObjectFactory的時候(如果按照上面的方法配置了), 這意味著WebWork會首先請求Spring創(chuàng)建這個Action并按照缺省的自動裝配策略設(shè)定依賴的屬性.SpringObjectFactory還會調(diào)用所有bean的處理器來處理事務(wù),安全等方面的代理機制.不需要特殊的設(shè)置Spring就可以自動確定.對大多數(shù)的應(yīng)用,這會配置你的Action所需的服務(wù)和依賴,來達到你的所有要求.
我們強烈推薦你找到一種聲明的方法來讓spring知道該為你的Action提供什么.這包括把你的Action里的屬性命名為在Spring配子文件里定義的Bean的名字一致,這樣可以實現(xiàn)基于名字的自動裝配,還可以使用JDK5的標(biāo)注來聲明事務(wù)和安全層需要.如果你能找到方法讓Spring知道你的Action需要什么而且不需要在applicationContext.xml里面進行外部配置的話,你就不需要在2個地方維護配置了. |
然而,有時你可能想要Spring來完全管理Bean.這是有實際意義的,例如,你如果想對你的Bean使用AOP或者Spring的相關(guān)技術(shù),例如Acegi.為了達到這個目的,你僅僅要做的就是在xwork.xml里移除你的WebWork Action的類的屬性,然后在applicationContext.xml里面配置這個Bean.
你的xwork.xml文件里面的action應(yīng)該這樣定義:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.1.dtd">
<xwork>
<include file="webwork-default.xml"/>
<package name="default" extends="webwork-default">
<action name="foo" class="foo">
<result>foo.ftl</result>
</action>
</package>
<package name="secure" namespace="/secure" extends="default">
<action name="bar" class="bar">
<result>bar.ftl</result>
</action>
</package>
</xwork>
Where you have a Spring bean defined in your applicationContext.xml named "bar". Note that the com.acme.Foo action did not need to be changed, because it can be autowired.
(你需要在你的applicationContext.xml里定義一個名字為"bar"的bean. 注意 com.acme.Foo不需要被改變,因為它是自動裝配的.)
記住:這個不是必須的.僅僅當(dāng)你需要使用Spring的攔截器或者IoC來修飾Action以便覆蓋Webwork的缺省行為時,這才是必要的.要記住一點,WebWork的Spring組合會執(zhí)行標(biāo)準(zhǔn)的IoC,使用你指定的自動裝配策略,即使你沒有明確第在Spring中映射每個Action.所以通常你不需要做這個,但是知道怎么做對你是有好處的,如果你需要的話.
和以前版本的區(qū)別
其實本質(zhì)上是一樣的,主要區(qū)別如下:
- 可以不配置SpringObjectFactoryListenter,直接在webwork.properties里指定.
- 在webwork.properties里可以指定autoWire策略.
SpringObjectFactory里面多了一個buildAction,用來根據(jù)前面提到的命名習(xí)慣查找action. (已經(jīng)刪除)
其他
其實通過查看源碼可以知道,還有幾個其他的類,可以做其他的設(shè)置,例如SpringProxyableObjectFactory,SessionContextSpringProxyableObjectFactory等,至于如何使用,那就慢慢研究吧 :)