SpringMVC的controller和Struts2的action的scope区别

SpringMVC的controller的scope默认是单例的,也就是scope=“singleton”,说白了就是不管你前台怎发请求,而我的controller是不会重新去new的,它与前台发的
请求有直接对应关系的是controller里面的各个方法,controller里面的各个方法时相互独立的,也就说每个方法独享request,response数据,方法之间是没有任何联系
的,方法之间不会共享参数变量的。同时springmvc处理请求时是通过servlet机制处理的,当前台请求发送到服务器时,被servlet拦截,请求是直接转发到controller类里面
的某个映射方法,其参数是通过框架注入进方法里面。


而Struts2的action的scope默认是多例的,也就是scop=“prototype”,这个就说明了,你发了几个请求,我就给你生成几个action给你使用,至于你怎么用,我是不会管的,
请求是直接对应每个action的对象的,其action里面的方法虽然说也算是独立,但是前台传过来的数据是可以在各个方法之间进行共享的,这也是action为什么不能使用单例的
直接原因,action里面的属性值一般都是必须要有get和set方法,因为当前台请求被filter拦截后,框架会直接通过set方法直接注入到目标action类里面去的。


说了这么多,说白了我的理解就是,由于action里面有各个参数的属性,所以你不能让它变成一个单例,而controller里面由于没有各个参数的属性,所以它默认是个单例
模式,而且每次请求把request中的参数直接注入到action里面的各个属性里和把参数注入到controller的方法里其实可以看成是差不多的,只不过区别是方法可以不用重新new,
而action必须要重新new。也就是说如果action里面没有那些参数属性的话,那么action.xml里面的scope也是能设置成单例的。


对于上面那个为什么action里面有参数属性就不能变成单例的问题,我的理解是这样的,举个例子吧
一个盒子里有三个苹果,现在有甲乙两个人,甲乙两人同时访问的数量是三个,于是甲打算先拿一个,之后再拿两个
而乙正好在甲拿走一个后,从盒子里把剩下的两个给拿走了,而甲想后面再拿两个,这明显是不现实的。但是你假如
有两个箱子,箱子里都有两个苹果的话,那么不管乙怎么拿,都不会影响到甲的,同理甲怎么搞都影响不到乙的,这就是
为什么必须要用多例的原因。这个就说明了action是线程不安全的!
以上只是我个人的一些浅薄理解,希望能得到各位大神的指正!



【SpringMVC的controller和Struts2的action的scope区别】





    推荐阅读