`

Struts2+hibernate+spring 配置文件中scope="prototype"的作用

 
阅读更多

项目中对一个表的增删该操作是用一个action,这个action有add,update,delete,save这些方法,添加和修改是共用一个页面,当页面得到id时代表进行的修改操作,反之是添加操作。因为在配置spring的bean是忘了写scope="prototype"所以每次添加时都显示最后一次访问过的记录 
找了很长时间,原来是spring bean出了问题。 scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。如果没有配置scope=prototype则添加的时候不会新建一个action,他任然会保留上次访问的过记录的信息。

webwork的Action不是线程安全的,要求在多线程环境下必须是一个线程对应一个独立的实例,不能使用singleton。所以,我们在Spring配置Webwork Action Bean时,需要加上属性scope=”prototype”或singleton=”false”。 

spring片段代码

<!--↓=============ACTION==============↓-->
 <bean id="userActicon" class="*******.UserAction" scope="prototype">
  <property name="userService">
   <ref bean="userService"/>
  </property>
 </bean>
 <!--↑=============ACTION==============↑-->
 singleton模式指的是对某个对象的完全共享,包括代码空间和数据空间,说白了,如果一个类是singleton的,假如这个类有成员变量,那么这个成员变量的值是各个线程共享的(有点类似于static的样子了),当线程A往给变量赋了一个值以后,线程B就能读出这个值。因此,对于前台Action,肯定不能使用singleton的模式,必须是一个线程请求对应一个独立的实例。推而广之,只要是带数据成员变量的类,为了防止多个线程混用数据,就不能使用singleton。对于我们用到的Service、Dao,之所以用了singleton,就是因为他们没有用到数据成员变量,如果谁的Service需要数据成员变量,请设置singleton=false。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在配置文件中,bean默认是单例模式,应用服务器启动后就会立即创建bean,以后就可以重复使用。 这带来一个问题,bean的全局变量被赋值以后,在下一次使用时会把值带过去。也就是说,bean是有状态的。 在web状态下,请求是多线程的,全局变量可能会被不同的线程修改,尤其在并发时会带来意想不到的bug。 而在开发时,访问量很小,不存在并发、多线程的问题,程序员极有可能会忽视这个问题。 所以在配置action bean时,应使用scope="prototype",为每一次request创建一个新的action实例。这 符合struts2的要求,struts2为每一个request创建一个新的action实例。当request结束,bean就会被jvm 销毁,作为垃圾收回
当然,也可以设置scope="session",也能避免web中action的并发问题,只为当前用户创建一次bean,直至 session消失。在这种情况下,对当前用户而言,bean是有状态的。好处就是少创建bean的实例,有那么一 点点性能的提升
应用场景:
1. 多数情况下应使用prototype
2. 若用户不多,且频繁操作(频繁使用action),硬件一般,可以考虑session,兴许还能提升一点点性能。
分享到:
评论

相关推荐

    struts2+hibernate+spring整合

    4. 在Spring配置文件中定义Action类Bean,并设置为原型(prototype)作用域。 5. 配置Hibernate的SessionFactory和DataSource。 在实际开发中,我们通常按照数据库层(POJO和Hibernate映射)、数据访问层(DAO)、...

    SSH整合 struts+hibernate+spring

    - **Spring配置文件**:在Spring配置文件中定义Bean及其依赖关系,当需要更换实现类时,只需修改配置文件即可,无需修改代码。 - **IoC整合的注意事项**: - 使用接口而非实现类进行依赖。 - 推荐使用Spring...

    maven3+struts2+spring+ibatis

    maven3+struts2+spring+ibatis,本来是用maven3+struts2+spring+hibernate但考虑到hibernate在多表级联查询的时候执行效率不高,所以改用性能更好不过sql比较麻烦的的ibatis,本项目只有登录和插入数据,仅供参考: ...

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发

    在基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发中,开发者可以利用注解(Annotation)来简化配置,提高开发效率。这个开发模式结合了三个主流的Java EE框架:Struts2作为MVC框架处理前端请求,...

    struts2+spring+hibernate整合中spring注入出错。页面中报空指针异常。高手来看看怎么决绝。

    5. **Spring插件**:在Struts2中使用Spring插件(`struts2-spring-plugin.jar`),确保插件已添加到项目类路径中,并在Struts配置文件中启用插件。 6. **初始化顺序**:有时候,初始化顺序也可能导致问题。例如,...

    Struts2+Spring3+Hibernate3整合文档

    由于Struts2中的Action对象是针对每个请求生成一个新的实例,而Spring默认使用`singleton`作用域来管理Bean。为了与Struts2保持一致,需要将Action的Scope设置为`prototype`或`session`。 - **`prototype`**:为每...

    struts2+spring3+hibernate3整合源码包

    Struts2、Spring3和Hibernate3是Java Web开发中的三个重要框架,它们分别负责MVC模式中的动作控制、依赖注入和持久化管理。这三者的整合可以构建出高效、松耦合的应用系统。下面将详细讲解这三个框架的核心概念以及...

    maven3.0+struts+spring+hibernate

    这个属于与Spring整合的问题,Spring容器在初始化对象的时候会根据bean的scope配置来考虑是重新建立一个对象,还是继续使用原来的对象,拿struts2的action的bean来说,如果scope这个参数没有配置,默认就是单例,即...

    struts2.2.3+spring3.1.0+hibernate4.0整合

    整合Struts2和Spring,首先需要在Struts2的配置文件`struts.xml`中添加Spring插件,这样Struts2可以通过Spring来管理Action类。接着,将Action类声明为Spring的bean,并在Spring的配置文件`applicationContext.xml`...

    struts2+hirbate+spring面试题

    确保Action线程安全的方法包括:声明局部变量、扩展RequestProcessor以每次创建新的Action实例,或者在Spring中使用`scope="prototype"`配置来管理Action。 2. **Struts2的MVC实现** 在Struts2中: - **Model**:...

    Spring+Hibernate+Struts2整合文档

    在`struts.xml`中,通过`objectFactory`属性设置为`springs`,使Struts2能与Spring的IOC容器集成,这意味着Struts2的Action类将由Spring容器创建和管理,具体配置如下: ```xml &lt;constant name="struts....

    Spring+Struts+Hibernate开发手册.doc

    Spring+Struts+Hibernate开发手册 本文将介绍SSH框架的开发手册,主要包括Spring、Struts和Hibernate三大模块的知识点。 一、目录结构 在SSH框架中,项目的目录结构主要包括以下几个部分: * doc目录:存放项目...

    struts+spring+hibernate面试题.doc

    - **Spring的Scope="Prototype"管理**:利用Spring的bean管理功能,将Action的scope设置为"prototype",确保每次请求都会创建一个新的Action实例。 ### 2. Struts的MVC实现 Struts框架遵循经典的Model-View-...

    struts2+spring整合

    - 在Spring配置文件中定义Action类及其依赖,Action类通常配置为`scope="prototype"`,以确保每次请求都能获得一个新的实例。 - 在Struts2的配置文件(通常是struts.xml)中,指定`&lt;action&gt;`元素的`class`属性为...

    struts1.3+hibernate3.3+JPA集成

    为了确保Action的线程安全性,我们可以在Spring配置中将其作用域设置为`prototype`,这样每次请求都会创建一个新的实例: ```xml &lt;bean id="savePersonAction" class=...

    struts+hibernate,spring面试题

    为了确保线程安全,可以避免使用类变量,或者在Spring中将Action配置为原型(`scope="prototype"`),这样每次请求都会创建一个新的Action实例。 2. **Struts实现MVC**: 在Struts框架中,Model由JavaBean或EJB...

    Spring+Hibernate+Struts

    "spring_scope"可能涵盖了Spring的Bean作用域,如Singleton、Prototype、Request、Session等,以及它们在不同场景下的应用。 Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。"spring_hibernate_1"和...

    收集的struts+spring+hibernate面试题.doc

    ### Struts + Spring + Hibernate 面试题解析 #### 1. AOP 和 IOC 的概念以及在 Spring 中的应用 **AOP(Aspect Oriented Programming,面向切面编程)**: 是一种编程思想,它允许程序员定义“切面”来封装那些...

    收集的struts+spring+hibernate面试题借鉴.pdf

    确保Action线程安全的方式包括使用局部变量、每次请求时创建新的Action实例(例如通过Spring的`scope="prototype"`配置),或者扩展`RequestProcessor`以实现线程局部存储。 4. MVC模式在Struts中实现如下:Model由...

    图解SSH(struts2,spring,hibernate)框架配置步骤

    SSH 框架,全称为 Struts2、Spring 和 Hibernate 的组合,是Java Web开发中常用的三大框架。它们各自负责应用程序的不同层面:Struts2 负责表现层,Spring 提供业务逻辑支持和依赖注入,Hibernate 处理持久化层。在...

Global site tag (gtag.js) - Google Analytics