转载

Struts2 Spring整合方案

Struts2是一个优秀的MVC框架,但是在与Spring框架整合时,Struts2的Action如何创建、如何管理、Action如何访问业务逻辑组件等,这些是框架整合需要注意的问题,稍不注意,则会遇到一些“坑”,接下来,我将为大家介绍两种Struts2-Spring框架整合策略。

整合方案概述

Struts2和Spring有两种整合策略,策略一:由Spring管理Action的生命周期和逻辑组件的依赖注入;策略二:由Spring插件管理Action,并使用自动依赖注入方式注入Spring容器中的逻辑组件。

策略一

在该策略中,当我们配置struts.xml配置文件的Action的class属性时,不需要编写完整的Action类路径,只需要编写Action类在Spring容器中对应的Bean的id即可。在这里我们配置的class的值为“BeanId”,它不是一个类路径,我们称其为“代理Id”。

Struts2 Spring整合方案

然后在Spring的配置文件applicationContext.xml中,我们需要添加Action类的配置,并且使用Spring的IOC特性,进行业务逻辑代码的依赖注入。该例子中,Action在Spring的配置文件的Id为“BeanId”,与上文Action的class属性值对应;Action对应的Bean必须是多例的(即scope=“prototype”),并且为其注入id为“service1”的业务逻辑组件。

Struts2 Spring整合方案

然后访问该Action多次,此时struts会根据struts.xml的class属性值“BeanId”到Spring容器中寻找实例。可以发现控制台打印如下信息,可以看出每次打印出来的hashCode都是不同的,即每次访问都会创建一个Action实例。

Struts2 Spring整合方案

这里有一个注意点,Spring 默认是以单例模式来管理对象实例的,而Action在大部分情况下是非单例的,所以我们需要在配置Action时加上scope="prototype",否则Action就变成单例模式,运行结果将会变成如下所示:

Struts2 Spring整合方案

方案二

在该整合策略中,其配置模式与单独使用Struts2 的配置文件相似,其struts.xml和applicationContext.xml 的配置分别如下所示:

Struts2 Spring整合方案

Struts2 Spring整合方案

在Action中,编写了对应的setter方法,Spring插件会通过Action的属性名从Spring容器寻找对应的实例进行自动依赖注入,当然也可以通过修改struts.objectFactory.spring.autoWire常量来修改自动装配规则。

Struts2 Spring整合方案

程序以struts.xml中Action的class属性值为实例名,在Spring容器中寻找对应的实例,如果找到,直接返回该实例;如果没有找到,Spring插件则以该属性值为完整类名创建实例,该模式下创建的实例均为多例模式。程序运行结果如下:

Struts2 Spring整合方案

【注】如上两个程序的源码可以在我的github上查看: https://github.com/zhenghangjin/strutstest

总结

本文介绍了两种struts2和spring整合策略,策略一由spring管理Action的方式,其优点是更好地运用Spring的IOC特性,对Action、Service、Dao组件进行统一的管理。缺点是Action需要在struts和spring中进行配置,显得有些臃肿。而且Spring中Action的scope的配置往往容易被忽略,大多数情况下,Action需要配置为多例,如果忽略该配置,单例的Action会导致线程不安全(不同用户的请求或同一用户的不同请求的参数都会互相影响)。个人推荐使用整合策略二。

策略二由Spring插件创建Action,并实现自动装配。该方式的优点是配置简单,属性自动装配。缺点是属性的自动装配方式要求Action的成员变量名和Spring容器的实例名保持相同,命名自由度不高。

本文受原创保护,未经作者授权,禁止转载。 linkedkeeper.com (文/郑杭进)

原文  http://www.linkedkeeper.com/detail/blog.action?bid=1038
正文到此结束
Loading...