现在的位置: 首页 > 综合 > 正文

Struts1 和 Struts2 是否是单例

2018年05月23日 ⁄ 综合 ⁄ 共 913字 ⁄ 字号 评论关闭

 

struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了;

struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。

struts1 中actioin 是单例,即所有session对应一个action
由spring来创建action时,默认处理,为单例(既然是单例,即使你设置成了多例,也不影响程序功能)

struts2 中action 是多例,即一个session产生一个action。
由spring来创建action时,须设置为prototype的,不能是singleton。

个人感觉,之所以struts2中action必须是多例的,主要原因在与请求数据和返回数据,大多都封装到了action中,用于实例变量,这样以来,如果将action设置成单例模式,则多个线程访问的时候,就会共享这些数据,从而引起数据混乱或者线程安全问题!

线程模式:
" Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
" Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Action执行的控制:
" Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
" Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

抱歉!评论已关闭.