struts2 整合spring

其他方式不说,仅说这一种方式,我个人觉得这种方式很方便,struts2 的action 的配置无需变动,也不用放到spring的xml中去管理action,action依然由struts控制管理,service层以下的东西由spring来管理。
首先用Listener的方式来启动spring:
在web.xml中加入listener:
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener>
</listener>
ContextLoaderListener 会使用contextConfigLocation参数,启动加载spring配置,建立WebApplicationContext,并将其保存在ServletContext中,见spring中的源码:
------------------------------------------------------
.......
   this.context = createWebApplicationContext(servletContext, parent);
   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
........
------------------------------------------------------
然后spring就启动好了,那么现在就是把spring整合到struts中来,需要做的就是在struts的配置文件struts.properties  中加入struts.objectFactory 和struts.objectFactory.spring.autoWire属性。(当然这些属性也可以不用struts.properties,可以写在struts.xml配置文件中,使用: <constant name="struts.objectFactory" value="spring"/><constant name="struts.objectFactory.spring.autoWire" value="name"/>)
文件struts.properties:
struts.objectFactory=spring
struts.objectFactory.spring.autoWire=name
...................
OK, action的配置不用理会spring,自己配置即可,现在需要spring做的就是把service业务对象注入到struts的action中。要做到这样仅需做以下步骤即可:
在action中声明service业务对象属性,如:
private UserService userService;
注意,必须为userService提供setter:
private UserService setUserService(UserService userService){
            this.userService=userService;
}
然后在spring的配置文件applicationContext.mxl中配置好UserService的bean。注意其id必须和action中的UserService属性的属性名一样:
...
<bean id="userService" class="com.yourcompany.service.impl.UserServiceImpl">
</bean>
...
注意这里UserService 是接口,其实现类是: UserServiceImpl。
到此,简单的测试应用就可以正常工作了,web容器把控制权交给struts的控制器 ActionServlet后,ActionServlet会根据struts的配置信息获取到一个Action,然后ActionServlet 会使用spring来注入 Action 中对应的属性根据属性名。
另外如果你有特别需求,需要获取到 spring的ApplicationContext上下文,并通过它来获取一些bean的话,可以这样获取: WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext) 来获取。

 

由spring治理struts的Action实例

  •  action 自己管理生命周期 。当指定struts.objectFactory为spring时,struts2框架就会把bean转发给spring来创建,装配,注入。但是bean创建完成之后,还是由struts容器来治理其生命周期。配置方式:

struts.xml中:

xml代码constantname="struts.objectFactory"value="spring"/

 

struts.properties中:

 

java代码struts.objectFactory=spring通常情况下,这样子就够了,然后在struts的action-mapping配置文件中,如下:

 

xml代码actionname="user"class="com.myapp.admin.web.action.user.UserAction"/action

 

即可,假如在Action中有依靠于其它的BEAN,也会被自动注入进来。这时候,Action实例是以prototype方式创建的,SPRING会为每个请求创建一个ACTION的实例。

 

  • spring 管理其生命周期。在某些时候,你可能希望不仅仅让SPRING创建和装配Action对象,还希望让SPRING完全治理这些对象,如希望使用AOP或者希望使用acegi时。这时候,只需要在spring的配置文件中定义这些action即可。如在applicationContext.xml文件中:

xml代码beanid="user"class="com.myapp.web.action.user.UserAction"/

 

然后在action-mapping中,指定即可。

 

需要注重的一个地方:Spring中的缺省作用域是Singleton作用域。而往往Action属于有状态的bean,应该使用prototype作用域。beanid="user"singleton="false"/假如忽略这个细节,在我们方便实用set,get方法处理数据的时候,可能会有线程安全上的风险。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐