当前位置:编程学习 > JAVA >>

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 id=<span class="code-quote">"personAction"</span> <strong><span style="color:#ff0000;">scope=<span class="code-quote">"prototype"</span></span></strong> class=<span class="code-quote">"quickstart.action.PersonAction"</span>>
        <span class="code-tag"><constructor-arg ref=<span class="code-quote">"personService"</span> /></span>
<span class="code-tag"></bean></span>

是单例模式,应用服务器启动后就会立即创建bean,以后就可以重复使用。

这带来一个问题,bean的全局变量被赋值以后,在下一次使用时会把值带过去。也就是说,bean是有状态的。

在web状态下,请求是多线程的,全局变量可能会被不同的线程修改,尤其在并发时会带来意想不到的bug。

而在开发时,访问量很小,不存在并发、多线程的问题,程序员极有可能会忽视这个问题。

所以在配置action bean时,应使用<strong><span style="color:#ff0000;">scope=<span class="code-quote">"prototype"</span></span></strong>,为每一次request创建一个新的action实例。这
符合struts2的要求,struts2为每一个request创建一个新的action实例。当request结束,bean就会被jvm
销毁,作为垃圾收回。

<em>当然,也可以设置scope="session",也能避免web中action的并发问题,只为当前用户创建一次bean,直至
session消失。在这种情况下,对当前用户而言,bean是有状态的。好处就是少创建bean的实例,有那么一
点点性能的提升</em>

   1. 多数情况下应使用prototype
    2. 若用户不多,且频繁操作(频繁使用action),硬件一般,可以考虑session,兴许还能提升一点点性能。


摘自 特种兵—AK47
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,