随着其他东西,Spring同时也是一个控制反转框架.(原文:Spring is, among other things, an Inversion of Control framework.) 它在WebWork 2.2中是推荐的IoC容器.你可以在
http://www.springframework.org找到更多关于Spring的信息.
|
此部分仅包括 支持 Spring集成的技术.当然,还有很多其他的方法把Spring和WebWork绑定在一起.请查看其他集成Spring的方法了解更多信息. 注意其他方法的任何一个都不被支持,而且可能随时发生变化!(原文:Note that none of the other methods are currently supported and could change at any time!) |
开启Spring集成
在WebWork中开启Spring支持是一件简单的事情,只需要安装最新的Spring的jar文件到你的classpath,然后添加下面的行到webwork.properties文件:
webwork.objectFactory = spring
如果你想要改变缺省的自动装配模式,也就是自动按照name装配(例如,使用你的bean属性相同的名字去查找在Spring里定义的bean),你也需要在你的webwork.properties中进行一下设置:
webwork.objectFactory.spring.autoWire = type
这个设置的选项包括:
name |
按照你的action的属性的名字和Spring里的bean的名字,如果匹配就自动装配. 这是缺省的 |
type |
按照你的action的属性的类型,在Spring注册的bean中查找,如果相同就自动装配.这需要你在Spring中仅注册了一个此类型的bean |
auto |
Spring会试图自动监测来找到最好的方法自动装配你的action |
constructor |
Spring会自动装配bean的构造函数的参数 |
在这种情况下,所有的对象都至少会试图使用Spring来创建.如果它们不能被Spring创建,然后WebWork会自己创建对象.接下来,你需要在web.xml打开Spring的Listener:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
|
需要更多的 ApplicationContext 配置文件?
既然使用一个标准的Listener来集成Spring,它可以被配置来支持除了applicationContext.xml之外的配置文件.把下面的几行添加到你的web.xml会让Spring的ApplicationContext从所有匹配给定的规则的文件中初始化:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>
</context-param>
浏览Spring的文件查看这个参数的详细描述.
|
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>
从内置的IoC切换到Spring
切换是非常简单的.Spring的设置就像上面描述的已经完成.为了完成迁移,你还需要
Switching is quite easy. Spring setup is done as described above. To complete migration, you will have to
- 适当地转换你配置的组件,从 components.xml 到 applicationContext.xml. 然后你可以安全地删除 components.xml.
- 在xwork.xml中,从你的拦截器stack里移除 组件拦截器. 虽然保留它在那里不会带来任何影响,但是从现在开始它只不过是多余的了.
|
Session 会话范围和Spring
Spring <= 1.3 不支持 session 会话范围的组件. Spring 2.0 版本会增加这个支持, 并且在对Spring 2.0M3 (beta) 的测试中被报告可以工作的很好. 请查阅 和Spring的Session组件一起工作 来了解这个话题的更详细信息.
|
从Spring中初始化 Action
正常情况下,在xwork.xml里你可以为每个action指定类.当你使用SpringObjectFactory(就像上面配置的)时WebWork会请求Spring来创建action并按照缺省指定的自动装配行为来装配依赖的组件.SpringObjectFactory 也会设置所有的bean的后置处理程序(post processors)来完成类似对你的Action进行事务,安全等等方面的代理的事情.Spring可以不依赖外在的配置来自动确定.对于大多数的使用,这就是你所全部需要的了,用来配置你的action,设置它们获取服务和依赖组件.
|
我们 强烈 推荐你找到一种声明式的方法来让Spring知道为你的action提供什么.这包括让你的bean能够自动装配,无论是把你的Action里的依赖的属性命名为和Spring应该提供的Bean的名字一致(这允许基于名字的自动装配),或者使用by type方式的自动装配,也就是在注册到Spring的Bean中需要的类型仅拥有一个.也可以包括使用JDK5的标准来声明事务和安全需求,而不是必须在你的Spring配置里明确设置代理.如果你能找到方法让Spring在没有任何明确的配置(在_applicationContext.xml_中)的情况下知道需要为你的action做什么,那么你就不需要在两个地方维护这个配置了. |
However, sometimes you might want the bean to be completely managed by Spring. This is useful, for example, if you wish to apply more complex AOP or Spring-enabled technologies, such as Acegi, to your beans. To do this, all you have to do is configure the bean in your Spring applicationContext.xml and then change the class attribute from your WebWork action in the xwork.xml to use the bean name defined in Spring instead of the class name.
当然,有时候你可能想要Spring完全来管理bean.这是有实际意义的,例如,如果你想要为你的bean设置更复杂的AOP或者Spring相关的技术,例如Acegi.为了达到这个目的,你所有必须要做的事情就是在Spring的 applicationContext.xml 里配置你的bean,然后在 xwork.xml 里改变你的WebWork action的类属性来使用在Spring里面定义的bean的名字,而不再使用类名.
你的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="com.acme.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>
在你的 applicationContext.xml 里定义了一个名字为 "bar"的Spring的bean.注意 com.acme.Foo 不需要改变,因为它可能是自动装配的.
一个典型的spring的bar的配置可能看起来像下面列出的一样.
<?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="bar" class="com.my.BarClass" singleton="false"/>
...
</beans>
|
注意spring配置里面的id属性对应xwork配置里面的class属性. 还要注意在spring配置中,singleton(单态) 属性被设置为false. 这通常是因为WebWork希望基于每个request来创建一个新的action.因此当用到Spring集成时,这会是期望的行为.让Spring的singleton 属性为false就可以做到这一点.
|
记住: 这不是必须的. 仅仅当你希望覆盖在WebWork中创建一个action时的缺省行为,而要用Spring的拦截器,以及Spring不能自动确定IoC策略时,这才是必要的. 要记住一点,WebWork的Spring集成会进行标准的IoC,使用你指定的任何自动装配策略,即使你没有明确第在Spring中映射每个Action.所以通常你不需要做这个,但是知道怎么做当你需要的时候对你是有好处的.