首先,来看看如何让Spring 来管理Action.

引入包struts2-spring-plugin-2.2.1.jar

配置 web.xml

 <!-- 指定spring的配置文件,主要配置spring为随着服务器启动而自启动,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->

<context-param>

  <param-name>contextConfigLocation</param-name>

  <param-value>classpath:beans.xml</param-value>

</context-param>

<!-- 对Spring容器进行实例化 -->

<listener>

     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

  <filter>

  <filter-name>struts2</filter-name>

  <filter-class>

  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

  </filter-class>

  </filter>

  <filter-mapping>

  <filter-name>struts2</filter-name>

  <url-pattern>*.action</url-pattern>

  </filter-mapping>

  


在struts.xml中加入

<constant name="struts.objectFactory" value="spring" />


有两种整合方式:
(1) 把Action配置在beans.xml里,利用Spring初始化Action的bean

将Struts的业务逻辑控制器类配置在Spring的配置文件中,Action中引用的业务类一并注入。 
(这样的处理,必须将action类的scope配置成property)
Xml代码
<bean id="LoginAction" class="yaso.struts.action.LoginAction">
       <property name="loginDao" ref="LoginDao"/>
</bean>

接着,在struts.xml或者等效的Struts2配置文件中配置Action时,指定<action>的class属性为Spring配置文件中相应bean的id或者name值。示例如下: 
Xml代码
<action name=”LoginAction” class=”LoginAction>
       <result name=”success>/index.jsp</result>
</action>


 (2) 不需要在beans.xml里配置Action,利用Struts-Spring_Plugin插件自动初始化Action

struts2和spring的两种整合方式_spring

业务类在Spring配置文件中配置,Action不需要配置,Struts2的Action像没有整合Spring之前一样配置,<action>的class属性指定业务逻辑控制器类的全限定名。

Action中引用的业务类不需要自己去初始化,Struts2的Spring插件会使用bean的自动装配将业务类注入进来,其实Action也不是Struts2创建的,而是Struts2的Spring插件创建的。默认情况下,插件使用by name的方式装配,可以通过增加Struts2常量来修改匹配方式:设置方式为:struts.objectFactory.spring.autoWire = typeName,可选的装配参数如下:


 name:相当于spring配置的autowrie="byName"(默认)
 type:相当于spring配置的autowrie="byType"
 auto:相当于spring 配置的autowrie="autodetect"
 constructor: 相当于spring配置的autowrie="constructor"

OK,这里说了配置部分,但是,这里有一个问题, 就是Spring管理Action,如果按照第一方式,那么只要通过scope="property"来配置为每个请求创建一个Action实例。 那么第二种方式,我们并没有指定Action的作用域。

(好似也没有地方可配……),那么,这样的整合方式,Action的创建到底是单例还是多例的呢? 
答案:也是每个请求一个实例.