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

转载 2015年04月08日 15:27:37

前几天同事碰到一个问题:正常来说按照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>

C# 多网卡 Server Listen

时间: 2004/5/20作者: Robert参考: MSDN电邮: zsc771120@yahoo.com.cn关键词: TcpListener IPEndPoint IPAddress IPAdd...
  • zzzsssccc
  • zzzsssccc
  • 2004-05-23 16:26:00
  • 1655

struts2与spring集成时,关于Action类中成员bean自动注入的问题

struts2与spring集成时,关于Action类中成员bean自动注入的问题     BeanSpringStrutsJSPXML public class LoginActio...
  • gao36951
  • gao36951
  • 2014-07-08 16:12:19
  • 1430

struts2与spring整合时提示无法注入bean的错误

缺少struts2-spring-plugin.jar
  • u013246459
  • u013246459
  • 2017-05-05 09:14:42
  • 300

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

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

Spring整合Quartz时,任务类中无法注入Bean的问题

项目中需要在tomcat启动时候就启动定时器运行定时任务,定时器采用在spring中集成quartz。 但是遇到了在任务类中需要引用注入类,但是注入类对象zhuangbeietongServic...
  • tuohuang0303
  • tuohuang0303
  • 2017-10-10 14:30:08
  • 792

spring几种依赖注入方式以及ref-local/bean,factory-bean,factory-method区别联系

转载一篇:http://blessht.iteye.com/blog/1162131       平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方...
  • wabiaozia
  • wabiaozia
  • 2016-05-15 15:18:42
  • 3181

spring 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入

今天被一个徐家汇商城的技术经理坑了一把;翻一下以前的代码,找找问题出在哪里了 ; 粗放的贴一下代码: 1.spring配置文件:这句画的意思是扫面以com.sand开头包中的所有有注解的类注入spri...
  • u010235716
  • u010235716
  • 2016-06-14 14:33:13
  • 2381

Spring注入日期到bean属性-CustomDateEditor

这一个Spring例子向您展示如何为bean属性注入一个“日期”。 package com.yiibai.common; import java.util.Date; public cl...
  • Wit_tang
  • Wit_tang
  • 2016-05-27 10:31:21
  • 2316

Struts2,action中用spring注入,启动服务时注入成功,action运行时对象又变成null了

在软件群中遇到一个求助者:  问各位大神一个问题,ssh框架里,action中用spring注入,启动服务时注入成功,action运行时对象又变成null了,这是怎么回事啊? 问题所在: 看了他的配...
  • latiohongjui
  • latiohongjui
  • 2017-06-02 11:00:23
  • 842

[坑]Spring和Struts2整合后,注入取出为null

坑就是坑,让我足足卡了五天。首先要说明的是这里指的是在action中注入的业务类取出为空。在做了相应的配置之后,如果注入的东西为空,可以先在对应的set方法中打个桩。如果set方法调用了,并且调用后,...
  • E_xiake
  • E_xiake
  • 2017-04-08 13:03:39
  • 437
收藏助手
不良信息举报
您举报文章:struts2与spring集成时,关于class属性及成员bean自动注入的问题
举报原因:
原因补充:

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