小心一个大坑:Struts1 和 Struts2 是否是单例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzc1993lzc/article/details/83623629

struts1:struts1的actioin是单例,即所有session对应一个action 由spring来创建action时,默认处理,为单例(既然是单例,即使你设置成了多例,也不影响程序功能),这时候要小心,在action 定义的全局变量对所有用户来说是共享的。

struts2:struts2中action 是多例,即一个session产生一个action。 由spring来创建action时,须设置为prototype的,不能是singleton。struts2中action必须是多例的,主要原因在与请求数据和返回数据,大多都封装到了action中,用于实例变量,这样以来,如果将action设置成单例模式,则多个用户访问的时候,就会共享这些数据,从而引起数据混乱或者线程安全问题,这也是struts1的缺点。

总结:

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

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

猜你喜欢

转载自blog.csdn.net/lzc1993lzc/article/details/83623629
今日推荐