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

  正常来说按照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",只要有<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配置文件中的相对应的Action的bean的Id的属性保持一致,系统即可通过Spring来装配和管理Action。
如果action包含了Service层的对象:

private StudentInfoServiceImpl studentInfoService;

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

public void setStudentInfoService(StudentInfoServiceImpl studentInfoService) {

this.studentInfoService = studentInfoService;

}

如果action在struts.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>

Struts2与Spring整合的方案二:

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

studentInfoService的配置:

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

    <constructor-arg>

        <ref bean="studentInfoDAO" />

    </constructor-arg>

</bean>

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

Action在struts.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>

原文地址:https://www.cnblogs.com/qlqwjy/p/8438091.html

时间: 2024-10-04 04:13:41

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

struts2的请求参数url的写法以及相关struts2与Spring集成时的情况

在使用struts2的时候,我们都知道以前的那种以离散的值作为传递的单位,他们的请求url是这么写的: localhost:8080/test/login?username=hello&password=world 以及其对应的action是这么写的 <span style="font-size:24px;">public class LoginAction extends ActionSupport { private String username ; priv

struts2与spring整合时需要注意的点

首先我们需要明白spring整合struts2中的什么东西,spring中的核心就是IOC和AOP,IOC是对象的容器,AOP是处理动态代理的;比如spring与hibernate整合时就要用到aop,具体就是把事务的开启与关闭交于spring中的aop处理.一句话,spring就是整合struts2的对象. 先前struts.xml配置文件中action标签中的class属性的值是"包名+类名",这样配置就可以让struts2自己生成对象,但这样不符合模式设计六大原则,为了解决这个问

Struts2和Spring集成

Spring是一个流行的Web框架,它提供易于集成与很多常见的网络任务.所以,问题是,为什么我们需要Spring,当我们有Struts2?Spring是超过一个MVC框架 - 它提供了许多其它好用的东西,这是不是在Struts.例如:依赖注入可以是有用的任何框架.在本章中,我们将通过一个简单的例子来看看如何集成Spring和Struts2一起. 首先,需要添加下列文件到项目的构建路径从Spring安装.您可以下载并安装最新版本的Spring框架从 http://www.springsource.

Mybatis与Spring集成时都做了什么?

Mybatis是java开发者非常熟悉的ORM框架,Spring集成Mybatis更是我们的日常开发姿势. 本篇主要讲Mybatis与Spring集成所做的事情,让读过本文的开发者对Mybatis和Spring的集成过程,有清晰的理解. 以mybatis-spring-2.0.2为例,工程划分六个模块. 一.annotation 模块 定义了@MapperScan和@MapperScans,用于注解方式扫描mapper接口.以及mapper扫描注册器(MapperScannerRegistrar

Spring容器是如何实现 Bean 自动注入(xml)

入口web.xml web.xml 配置文件 <!-- Spring Config --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</par

Struts2,Hibernate,Spring整合时的错误

1 type Exception report 2 3 message 4 5 description The server encountered an internal error that prevented it from fulfilling this request. 6 7 exception 8 9 java.lang.NullPointerException 10 com.bjsxt.registration.action.UserAction.execute(UserActi

Spring系列【7】零配置实现Bean的注入

与前几例不同,需要导入aop包. Book.java 注意Book类@Component 1 package cn.com.xf; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class Book { 7 private String name="JAVA从入门到精通"; 8 private double price=45.67; 9 public String getName

Spring系列【6】@Resource注解实现Bean的注入

Book.java 1 package cn.com.xf; 2 3 public class Book { 4 private String name; 5 private double price; 6 public String getName() { 7 return name; 8 } 9 public void setName(String name) { 10 this.name = name; 11 } 12 @Override 13 public String toString

Spring集成Struts、Hibernate----三大框架SSH(Spring、Struts和hibernate)

Spring 框架可以完成业务层的设计任务,Struts框架可以将表示层和业务层分离,而Hibernate框架可以提供灵活的持久层支持.下面介绍三大框架的集成环境: 1.配置Struts2. I.导入相关的JAR包. II.修改web.xml文件.Struts2的核心控制是通过过滤器(Filter)来实习的,所以在web.xml文件中需要进行过滤器的配置一边加载strust2框架.web.xml文件的代码如下: 1 <!-- 配置Struts2框架的核心Filter --> 2 <fil