CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

您现在的位置: IT专家网 > Web服务子站 > 技巧

Spring MVC framework深入总体分析

作者: ,  出处:中国IT实验室收集整理, 责任编辑: 李春禹, 
2007-12-10 13:07
  

  三、 Spring的Controller是Singleton的,或者是线程不安全的

  和Struts一样,Spring的Controller是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:我们不用每次创建Controller,减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。

  这也是Webwork2吹嘘的地方,它的每个Action都是线程安全的。因为每过来一个request,它就创建一个Action对象。由于现代JDK垃圾收集功能的效率已经不成问题,所以这种创建完一个对象就扔掉的模式也得到了好多人的认可。Rod Johnson甚至以此为例证明J2EE提供的object pool功能是没多大价值的。

  但是当人们在吹嘘线程安全怎么怎么重要的时候,我想请问有多少人在多少情况下需要考虑线程安全?Rod Johnson在分析EJB的时候也提出过其它问题,并不是没有了EJB的线程安全魔法,世界就会灭亡的,大多数情况下,我们根本不需要考虑线程安全的问题,也不考虑object pool.因为我们大多数情况下不需要保持instance状态。

  至少我写了那么多的struts Action,写了那么多的Spring Controller,几乎没有碰到需要在instance变量保持状态的问题。当然也许是我写的代码不够多,Struts的设计者Craig R. McClanahan曾经说当时他设计struts时有两个条件不成熟:当时没有测试驱动开发的概念;当时JVM的垃圾收集性能太次。假如现在重新设计的话,他也会采用每个request生成一个新对象的设计方法,这样可以解决掉线程安全的问题了。

  四、 Spring不象Webwork2或tapestry那样去隐藏Servlet相关的元素如HttpServletRequest或HttpServletResponse

  这又是一个重要的设计决定。在Webwork2里我们没有HttpServletRequest或者HttpServletResponse,只有getter, setter或ActionContext里数据,这样的结果导致一个干净的Action,一个与Web完全无关的Action,一个可以在任何环境下独立运行的bean.那么Webwork2的这样一个基于Command模式的Action究竟给我们带来了什么?我想主要有两点:

  1、 它使我们的Action可以非常容易地被测试。

  2、 用户可以在Action里添加业务逻辑,并被其它类重用。

  然而仔细跟Spring比较一下,我们就会发现这两点功能所带来的好处其实并不象我们想象的那么显着。Spring的Controller类也可以非常轻松被测试,看一下spring-mock下面的包吧,它提供的MockHttpServletRequest, MockHttpServletResponse还有其它一些类让测试Controller变得异常轻松。再看一下Action里的业务逻辑吧,Jason Carreira曾经说我们可以尽情地在Webwork2的Action里加业务逻辑,因为Action是不依赖于Web的。但是有多少人真正往Action里加业务逻辑的?大多数人都会业务逻辑delegate给另一个Service类或Manager类。因为我们很清楚,往Action里加业务逻辑会使整个体系的分层架构变得不清晰,不管怎样,Web层就是Web层,业务层就是业务层,两者的逻辑混在一起总会带来问题的。而且往Action里加业务逻辑会使用这个Action类变得庞大,Webwork2的Action是每个request都创建实例的,尽管带来的性能影响不太大,但并不表示每次都要把业务逻辑再new出来,业务逻辑在大多数的情况下应该是单例的。

  不把request和response展现给用户当然还会带来功能上的损失,也许一般的场合,用用webwork2提供的接口已经足够了,但有时我们必须要知道request和response才能发挥出更大的威力。比如我以前的一个项目里有一个通过递归动态生成的树状结构的页面,在jsp页面上显示递归是痛苦或不可能的,因此我用response直接write出页面,这在spring里很easy,但在webwork里可能比较难了(偶不敢肯定,偶研究得不够深,也许高手是有办法的)。

共4页。 9 1 2 3 4 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅

       
天极服务 | 关于我们 | About us | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2009, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i