struts2的控制类action是多例的spring
springMVC的控制器类Controller是单例的并发
struts2和springMVC区别在于对数据的处理不一样,struts2以属性形式绑定数据,所以必须多例才不会数据混乱。spa
springMVC是经过方法传递参数,绑定数据,每次调用方法传递的参数都是独立的,所以单列便可.prototype
1. 什么是单例多例:orm
所谓单例就是全部的请求都用一个对象来处理,好比咱们经常使用的service和dao层的对象一般都是单例的,而多例则指每一个请求用一个新的对象来处理,好比action;
2. 如何产生单例多例:
在通用的SSH中,单例在spring中是默认的,若是要产生多例,则在配置文件的bean中添加scope="prototype";
3. 为何用单例多例:
之因此用单例,是由于不必每一个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之因此用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另外一个请求,而以前请求对对象状态的改变致使了对象对另外一个请求作了错误的处理;
用单例和多例的标准只有一个:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,不然单例;
4. 什么时候用单例?什么时候用多例?
对于struts2来讲,action必须用多例,由于action自己含有请求参数的值,便可改变的状态;
而对于STRUTS1来讲,action则可用单例,由于请求参数的值是放在actionForm中,而非action中的;
另外要说一下,并非说service或dao必定是单例,标准同第3点所讲的,就曾见过有的service中也包含了可改变的状态,同时执行方法也依赖该状态,但同样用的单例,这样就会出现隐藏的BUG,而并发的BUG一般很难重现和查找;对象