我想知道如何以及将Struts 1.x应用程序与Spring 3.x集成的首选方法,以便我们可以从IOC中获益。
答案 0 :(得分:6)
使用ContextLoaderPlugin并将struts控制器设置为processorClass“AutowiringRequestProcessor”,如下所示(在struts-config.xml中):
<controller>
<set-property property="processorClass" value="org.springframework.web.struts.AutowiringRequestProcessor" />
</controller>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/config/action-servlet.xml"/>
</plug-in>
action-servlet.xml必须是空bean上下文文件:
<beans></beans>
将以下init参数添加到web.xml中的ActionServlet:
<init-param>
<param-name>autowire</param-name>
<param-value>byName</param-value>
</init-param>
只需编写常规struts操作,并将注释“@Component”添加到每个操作,以便spring将发现操作并从中创建bean。 “AutowiringRequestProcessor”将找到与struts-config.xml中定义的动作类相匹配的正确bean。
现在也可以在setter上使用@Autowired将其他bean注入到Action类中。
答案 1 :(得分:2)
使用ContextLoaderPlugIn。在Spring 3.0中已经弃用,但仍然存在。
我在Struts 1.x和Spring 2.5.x中使用它 - 它工作得很漂亮。这种集成方法允许将Spring bean直接注入到Struts操作中,这非常简洁明了。
答案 2 :(得分:2)
您可以使用ApplicationContextAware接口让实用程序类可以访问ApplicationContext。
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
public static Object getSpringBean(String beanName) {
return applicationContext.getBean(beanName);
}
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
applicationContext = appContext;
}
}
然后,您可以从Action类访问静态方法。
public class MyAction extends LookupDispatchAction {
private MyService getMyService() {
return (MyService) SpringUtil.getSpringBean("myService");
}
}
不是最优雅的解决方案,但它确实有效。
答案 3 :(得分:-1)
这不起作用。在Spring 2.x之后的任何版本的Spring中都没有ContextLoaderPlugin。 Struts 1.x与2.x之后的任何版本的Spring都不兼容。在2.x之后配置任何版本的Spring以使用Struts 1.x是不可能的。您可能需要降级Spring版本的Struts升级版。除非你使用超过3.x的休眠版本,否则降级Spring可能会更容易。