struts1和struts2是单例还是多例的?

今天电话面试中问到一个问题:struts是单例还是多例的? 想想还真没考虑过,现在就来分析下

实际上,struts1是单例的,struts2是多例的

为什么呢?

1、struts1是单例的

" Struts1 Action是单例模式并且必须是线程安全的,必须确保Action资源是线程安全的或同步的。

为了确保线程安全(thread-safe),在一个应用的生命周期中,Struts框架只会为每个Action类创建一个Action实例(与servlet是一样的)。所有的客户请求共享一个Action实例,并且所有请求线程可以同时执行它的execute()方法。 

所以,每个action只有一个实例, 在action打印this也可以看到, 确实是一样的, 
所以, 不要在Action里面全局的变量,只在方法内部使用局部变量, 没有意义而且不安全。

使用actionForm则不会有问题,原因也很简单: 
   
   actionForm 是通过参数形式传入action的,不存在共享变量的问题,其实每个request产生的actionForm实例也是不同的。

因此在使用struts 1.x的时候要注意线程安全性问题

 

Action执行的控制:
" Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

2、struts2是多例的

" Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)


Action执行的控制:
" Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

猜你喜欢

转载自675081098.iteye.com/blog/2196682