struts2与spring集成时,关于class属性及成员bean自动注入的问题

转载 2014年04月21日 09:44:34

前几天同事碰到一个问题:正常来说按照Spring官方配置,在struts2与spring整合时,struts配置文件中class属性指向spring配置的bean id,但是在class指向类路径时,依然能注入service。


public class LoginAction extends ActionSupport{

  
 private LoginService loginService;

 
 public void setLoginService(LoginService loginService) {
  System.out.println("init Service......");
  this.loginService = loginService;
 }

 

 

spring配置

 

<bean id="loginService"  class="org.xxxxx.services.impl.LoginServiceImpl"></bean>

 <bean id="loginAction" class="org.xxxxx.action.LoginAction">

 

 </bean>

 

struts配置

<action name="login" class="org.xxxxx.action.LoginAction">
   <result name="success">/result.jsp</result>
   <result name="error">/login.jsp</result>
  </action>

 

1.注意看以上两个红线部分,在struts.xml中action指定的class像上面这种方式指定全类路径名的话,这时,不论spring配置文件中的<bean id="loginAction" class="org.xxxxx.action.LoginAction"></bean>有没有指定配置<property name="loginService" ref="loginService"/&gt;,只要有<bean id="loginService" .../>存在,并且这个ID的名字与Action中成员bean的名字一致,当实例化Action类时,会一并将loginService的实例注入。

  并且还存在一个问题当struts.xml此种方式配置时,spring中如果配置了此action实例,并添加scope=“prototype”多例属性,则会在访问时报错。可能struts2本身是多例与spring实例化机制冲突。所以此种方式配置时,可废弃spring中的action类配置。

 

2.如果<action name="login" class="loginAction">这里的class指定spring配置文件中的bean的id,则不会出现loginService自动注入问题,而是根据<bean id="loginAction" class="org.xxxxx.action.LoginAction"></bean>有没有指定配置<property name="loginService" ref="loginService"/>来决定,有<property name="loginService" ref="loginService"/>的指定,则实例化Action类时,会一并将loginService实例注入,没有配置property,loginService则为空


所以会产生两种struts与spring的配置方案:

(1)配置方案一

在配置Action时,需要将class属性和Spring配置文件中的相对应的ActionbeanId的属性保持一致,系统即可通过Spring来装配和管理Action
如果action包含了Service层的对象:

private StudentInfoServiceImpl studentInfoService;

则需要添加set方法,才可以使用Spring依赖注入:

public void setStudentInfoService(StudentInfoServiceImpl studentInfoService) {

    this.studentInfoService = studentInfoService;

}

如果actionstruts.xml如下配置:

<action name="studentRegister" class="studentRegisterAction">

    <result name="result">/WEB-INF/exam/result.jsp

    </result>

    <result name="input">/WEB-INF/exam/error.jsp

    </result>

    <interceptor-ref name="excludeParamsStack" />

</action>

则在applicationContext.xml文件中该Action的配置如下:

<bean id="studentRegisterAction" class="com.exam.actions.StudentRegisterAction" scope="prototype"><!--指定多例-->

    <property name="studentInfoService">

        <ref bean="studentInfoService" />

    </property>

</bean>

Struts2Spring整合的方案二:

前面两个步骤和方案一的一样;
在配置struts.xml文件时,Actionclass为该Action的类路径,而在applicationContext.xml配置文件中不需要添加Actionbean配置。这样,当我们使用Action类时,由于studentInfoService已经配置了相关的bean,所以会自动装配,并且action依然由spring进行实例化。

studentInfoService的配置:

<bean id="studentInfoService" class="com.exam.service.StudentInfoServiceImpl">

    <constructor-arg>

        <ref bean="studentInfoDAO" />

    </constructor-arg>

</bean>


重点studentInfoService和action中的属性要一样!!

Actionstruts.xml中的配置如下:

<action name="studentRegister" class="com.exam.actions.StudentRegisterAction"><!--struts2 默认多例-->

    <result name="result">/WEB-INF/exam/result.jsp

    </result>

    <result name="input">/WEB-INF/exam/error.jsp

    </result>

    <interceptor-ref name="excludeParamsStack" />

</action>

在JSP页面中调用Spring容器注入的Bean的2种方法

jsp中调用Spring容器注入的Bean
  • actionzh
  • actionzh
  • 2017年07月25日 10:34
  • 522

Spring整合Structs2时,Action类中的成员变量(Bean)的注入

Action 中注入Spring 管理的BeanProductAction 是一个 Action,处理页面的请求,其中的save()方法使用到了业务层 ProductService对象,Spring ...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2016年11月25日 18:37
  • 2092

struts-config.xml文件中的form-bean和action-bean关系

用来设置Model的指向,这个例子意思是页面里的loginForm需要调用com.text.LoginForm 这个bean 如:                    type="com.t...
  • u013967628
  • u013967628
  • 2014年08月19日 17:42
  • 1549

sping+struts2中配置Action的bean中scope="prototype"的作用

昨天发了一篇文章《奇妙的paramsPrepareParamsStack——Struts2中ModelDriven问题》其实那也不是原因是根本,那个解决方法还是一样如我前面采用的方法:在每次转向之前把...
  • Tomsheng321
  • Tomsheng321
  • 2014年11月19日 17:43
  • 886

Spring读书笔记-----Spring的Bean之Bean的基本概念

从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置。         对于我们而言,我们...
  • chenssy
  • chenssy
  • 2012年11月25日 16:55
  • 87973

Spring bean标签 属性详解

Bean属性解析 1. id 属性 起名称 不能包含特殊符号 根据id 获得配置对象 2. class属性:创建对象所在全路径 3. name属性:功能和id一样 ,id不能包含特殊符号...
  • xuebing1995
  • xuebing1995
  • 2017年07月07日 16:02
  • 225

struts入门学习(struts中ActionForm,Action,javabean的运行机制 )

 struts学习(struts中ActionForm,Action,javabean的运行机制 )在此举一个用户注册说明struts中的几个类的用法1,建立一个javabean(User.java)...
  • mutoudianxian
  • mutoudianxian
  • 2007年11月13日 17:27
  • 3837

Sping中的配置Bean详解

一、spring实例化对象的方法 在Spring中,所有管理的对象都是JavaBean对象,而BeanFactory和ApplicationContext就是spring框架的两个IOC容器,现在一...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017年03月14日 21:42
  • 1785

Struts2学习笔记(6)-----Struts2的bean标签用法

Struts2的bean标签用于创建一个JavaBean的实例。创建实例时通过给JavaBean传入参数。如果通过给JavaBean传入属性值则需要给JavaBean设置setter方法,如果需要访问...
  • youqishini
  • youqishini
  • 2011年12月13日 22:05
  • 3406

---Struts2bean标签---

Struts2标签: bean: 用来处理属性范围中的属性,可以对其进行复制、添加和显示,并可以完成国际化功能   logic: 用来完成页面上的逻辑判断和迭代循环   html: 用...
  • snn1410
  • snn1410
  • 2012年04月21日 11:21
  • 1255
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:struts2与spring集成时,关于class属性及成员bean自动注入的问题
举报原因:
原因补充:

(最多只允许输入30个字)