• 为什么要将action实例设置为多例


    转载自 https://zhidao.baidu.com/question/622162406833405932.html

    struts2中action是多例的,即一个session产生一个action

    背景:

    1) Struts2会对每一个请求,产生一个Action的实例来处理.
    2) Spring的Ioc容器管理的bean默认是单实例的.
      首先从数据安全性的问题上考虑,我们的Action应该保证是多例的,这样才不会出现数据问题。

      但是如果有的action比如只有admin才能操作,或者某些action,全站公用一个来提高性能,这样的话,就可以使用单例模式。
      不过幸好,Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。

      如果用单例,就在spring的action bean配置的时候设置scope=”prototype”

      如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结果不一样.
      举个例子:有一块布长度300cm,能做一件上衣(用掉100cm)和一件裤子(用掉200cm);甲和乙同时访问得到的长度都是300cm,甲想做上衣和裤子,他先截取100cm去做上衣,等上衣做完再去做裤子,而乙这时正好也拿100cm去做上衣,那好,等甲做完上衣再做裤子的时候发现剩下的布(100cm)已经不够做裤子了…..

      这就是影响系统的性能,解决的办法就是给甲和乙一人一块300cm的布,就不会出现布被别人偷用的事情,也是就单实例和多实例的区别如果设置成单例,那么多个线程会共享一个ActionContext和ValueStack,这样并发访问的时候就会出现问题了

      struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。

      原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。

      如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。

      所以Struts2的Action是多例模式的。

      问题出现了,可以让Struts2的action变成单例模式么?

      Struts2中,可以使用注解开发,在Action上@Scope(“prototype”) 指定为多例 , 默认为singleton()单例)基本上action的scope需要是prototype,就是每次请求都建立新的线程不写的话,默认是singleton了

    Higher, faster, stronger!
  • 相关阅读:
    java图片加文字
    [转]NetBeans优化技巧 提升启动速度
    重建win7桌面图标缓存
    负载测试(Load Test)
    乐观锁与悲观琐的区别
    事物锁表问题
    建立silverlight安装环境
    持续集成ccnet
    C# AppDomain
    Windows Services
  • 原文地址:https://www.cnblogs.com/Meiwah/p/10882207.html
Copyright © 2020-2023  润新知