论坛首页 Java企业应用论坛

WebWork2.2中结合Spring:"新"方式

浏览 11259 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-09-21  
WebWork2.2中结合Spring


本文大部分内容来自http://wiki.opensymphony.com/display/WW/Spring,本文主要是把内容翻译过来,并加上一些补充,请以英文版本为准.

在WebWork2.2中,spring已经作为IOC的支持基础,原有的Spring结合的方法已经分别溶入到XWork和WebWork的源码中.

当然原有的组合办法依然有效,有可能一些类改了包名和类名,但是使用方法类似.

在WebWork2.2中,还有一种新的办法来结合Spring.


开启Spring组合

在WebWork中开启Spring支持是非常简单的,把最新版本的Spring的jar放到你的classpath中,然后在webwork.properties里面设置如下选项:
		webwork.objectFactory = spring

                此时使用的类是: com.opensymphony.webwork.spring.WebWorkSpringObjectFactory,也可以指定为其他SpringObjectFactory.

这时所有对象都首先来用Spring来创建.如果Spring没有创建这些对象,WebWork会自己创建这些对象. 然后,你需要在web.xml里面设置Spring的listener:
		<listener>
		    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
		</listener>


Spring配置示例

这时,你可以添加一个标准的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指定类. 这意味着WebWork首先会创建这个Action,然后按照指定的缺省的自动装配策略来设定依赖的属性. 然而,有时你可能想要Spring来完全管理Bean.这是有实际意义的,例如,你如果想对你的Bean使用AOP或者Spring的相关技术,例如Acegi.为了达到这个目的,你仅仅要做的就是在xwork.xml里移除你的WebWork Action的类的属性,然后在applicationContext.xml里面增加一个Bean.

你的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="foo" class="com.acme.Foo"/>
	    <bean id="bar" class="com.acme.Foo"/>
	</beans>


你的xwork.xml文件里面的action应该这样定义:

		<!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>


记住:这个不是必需的.仅仅当你需要使用Spring的拦截器或者IoC来修饰Action以便覆盖Webwork的缺省行为时,这才是必要的.要记住一点,WebWork的Spring组合会执行标准的IoC,使用你指定的自动装配策略,即使你没有明确第在Spring中映射每个Action.所以通常你不需要做这个,但是知道可以这样做对你是有好处的,如果你需要的话.


和以前版本的区别
其实本质上是一样的,主要区别如下:
可以不配置SpringObjectFactoryListenter,直接在webwork.properties里指定.
在webwork.properties里可以指定autoWire策略.


其他

其实通过查看源码可以知道,还有几个其他的类,可以做其他的设置,例如SpringProxyableObjectFactory,SessionContextSpringProxyableObjectFactory等,至于如何使用,那就慢慢研究吧


本文章遵守创造共用协议:署名,非商业用途,保持一致.   scud(飞云小侠)
   发表时间:2005-09-22  
:idea:
什么时候xwork.xml也配置到spring 里那就方便了.
这么费劲.
0 请登录后投票
   发表时间:2005-09-23  
要注意default.properties里面的webwork.objectFactory.spring.autoWire = name 配置

这个是会自动autoWire的.
0 请登录后投票
   发表时间:2005-10-09  
对2.2没有多少了解,估计也是和以前的做法一样
在运行时调用
com.opensymphony.xwork.setObjectFactory(ObjectFactory factory)
而xwork.xml中
&lt;action name="save" class="ctgu.xb.action.PublishAction" &lt;/action&gt;
class的实例化就是由ObjectFactory 来做的。
根本上还是归功于webwork极佳的可扩展性。
struts可没有这个本事呀!
0 请登录后投票
   发表时间:2006-01-02  
Webwork 2.2 beta4里边跟Spring的结合好像有些问题,总是不能成功。换成beta3的包就没事了。奇怪。
0 请登录后投票
   发表时间:2006-01-06  
beta4里面没有lisenter了,要看好。
0 请登录后投票
   发表时间:2006-01-06  
今天,又看了下上面这个例子里面的starter那个例子,配合jscud的讲解,发现:
它使用了Spring的自动装配,以下两段代码效果相同:
<beans default-autowire="autodetect">
	<bean id="personManager" class="com.acme.PersonManager"/>
</beans>


<beans>
	<bean id="personManager" class="com.acme.PersonManager"/>
	<bean id="listPeople" class="com.acme.ListPeople">
		<property name="personManager" >
			<ref local="personManager" />
		</property>
	</bean>
	<bean id="createPserson" class="com.acme.CreatePerson">
		<property name="personManager">
			<ref local="personManager" />
		</property>
	</bean>
</beans>


如果这样使用的话,如果在xwork里面配制好action的class,然后连这个class的bean都不用在spring里面声明了,其依赖也通过名字匹配自动装配了。
真简单啊,想知道spring的autowire有没有性能损耗,如果每次装配都反射会不会性能很差?
0 请登录后投票
   发表时间:2006-02-01  
试了一下,发现一个容易疏忽的问题。
Spring中bean默认的方式是singlton, 这样每次处理请求,都获得的是同一个action对象。所以,在spring中声明Action时候,应该加上singlton="false"。
看了一些介绍的文档,其中的例子似乎都没有提到这点。
0 请登录后投票
   发表时间:2006-02-01  
http://www.iteye.com/pages/viewpage.action?pageId=860
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics