• 2004-04-01

    我眼中的Spring

    Tag:向上走

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/125334.html

    用Spring有一段时间了,最近在部门内部做个Spring的培训,一个很自然的问题出现大脑之中,Spring好在哪?
    我可以摆出许多广告,但那不是我的感觉。于是,我向自己发问,要求一个属于自己的答案。

    Dependency Injection
    原来,它叫IoC。
    Martin Flower发话了,是个框架都有IoC,这不足以新生容器反转的“如何定位插件的具体实现”,于是,它有了个新名字,Dependency Injection。
    其实,它就是一种将调用者与被调用者分离的思想,Uncle Bob管它叫DIP(Dependency Inversion Principle),并把它归入OO设计原则。
    同Spring相比,它更早进入我的大脑。一切都是那么朦胧,直至Spring出现。
    慢慢的,我知道了它还分为Interface Injection(type 1),Setter Injection(type 2),Constructor Injection(type 3)。Martin Flower那篇为它更名的大作让我心目关于它的一切趋于完整。
    在Spring中,它是一切的基础。Spring的种种优势随之而来。
    于我而言,它为我带来更多的是思维方式的转变,恐怕以后我再也无法写出那种一大块的全功能程序了。

    动态配置
    这里提及的动态配置包括两个部分:系统的生成和系统的修改。
    基于Spring的应用是依赖配置文件组织起来的,这意味着我们所编写的程序,更多的是在完成具体的功能,而各个功能之间的串连,就要靠配置文件了。
    随之而来的一个好处就是,我们可以在不重新编译代码的情况下,改变系统行为。
    或许不修改代码可以成为另一个理由,但在我看来,修改Java代码和修改配置文件没有什么本质区别,只要能把配置文件视为另一种语言,不是吗?
    有位同事问我,Spring的配置文件的正确性是否只有运行时才能发现,道理上讲是这样的。每次修改配置文件,然后跑起来确定其正确性,这确实是一件费力不讨好的事。如果你是Eclipse的用户,你就幸福多了,已经有人开发了Spring的插件协助你完成这个工作。

    易测的结构
    曾经有一次在现场,我改一个简单的小bug,简单到加在一起改的代码不超过五行。但从我定位到错误到完全把bug修正,用了两个多小时,这使得两个同伴最后只能对我怒目而视。
    这其中固然有我自己糊涂的原因,代码不可测也是很重要的一个原因。每次修改了一句话,就要部署到应用服务器上,运行起来看结果。相信每个有在应用服务器上部署应用经验的人都知道那是多么漫长的过程。
    如果以前对我说,对于一个好的应用来说,可测试性也非常重要,我摆出一副非常不屑的态度,惨痛的教训彻底的教育了我。
    Dependency Injection让整个应用结构清楚了许多,我们可以针对每个具体的模块进行单元测试,而不必像过去一样,只有把整个应用部署到应用服务器上运行起来之后,才能测试。
    局部的稳定带来的是更多的信心,当系统一点点整合在一起,信心就越来越足。

    不存在的接口压力
    项目组中的一个同事对我说,用Spring跟没用一样。原因是我们的代码并没有继承Spring中的类,也没有实现Spring中的接口。
    这恰好就是Spring的优势之一,这使得我们的应用不必困在Spring上。依赖于特定的API就意味着要在一棵树上吊死。我们原来系统中很难测试的另一个原因就是在代码中遍布HttpServletResponse,这使得我们的代码只有放在Web容器中才能跑起来。
    Rod Johnson在评价一个Web框架的优劣时,将是否依赖于Servlet API作为一个及其重要的标准。
    依赖于特定API就意味着要依赖于特定的容器或是框架,就像Servlet一定要跑在Web Container里,EJB一定要有AppServer一样。
    没有了接口的压力,使得我们应用可以完全脱离Spring运行。在系统开发期间,我不断强调即便没有Spring,我们的应用依然可以自行组装来运行,给我这种底气的理由就是Spring没有侵略性的接口。另一个原因是当时我并没有对把整个系统放到Spring上有十足的把握。^_^

    消除Singleton
    Singleton是二十三个经典的设计模式之一,不幸的是,到了J2EE的世界,由于classloader的原因,它几乎成了一个经典的反模式。曾经在自己的代码中大量运用Singleton,部署中遇到的问题加上太多的重复代码,给我留下了一段不堪回首的经历。
    Spring的出现漂亮的解决这个问题,我只要在配置文件中配置一个bean,它缺省行为就是Singleton,我不必再为反模式抓空心思,不必再为了Singleton编码。

    择其善者而从之
    不同于很多技术,Spring并不是一个“要么全部,要么没有”的东西,它是一个分层的结构。我们可以从中选取我们感兴趣的部分,而不必理会其它的部分。我用得最多的部分就是Spring的Core部分,也就是基于bean的配置框架,对于其上的MVC、ORM、DAO等等,我并不了解,但这丝毫不影响我的运用。

    开阔视野
    Spring本身包含很多的东西,从Dependency Injection之类思想性的东西,到现在颇为流行的AOP、ORM之类实现技术。在Spring的路线图中,JMX、JMS、JCA等等已经都纳入了Spring未来的发展计划中。于我而言,沉浸于Spring的世界里,一段时间内不愁没东西可学。
    Spring起源于Rod Johnson的《Expert One-on-One J2EE Design and Development》,所以,这本书成了Spring最好的辅导材料。书中的许多观点的提出完全是基于Rod本人的实际经验,比起不少假大空的理论或是广告来得实际得多。Spring邮件列表中有人这样评价,这本书值得“cover-to-cover”的读。如果你和曾经的我一样,迷失于J2EE纷繁复杂的世界中,这是一剂让你清醒过来的良药。

    这就是我眼中的Spring,这些理由比之许多Spring的广告显得单薄许多,因为我对Spring的了解实在有限,但这足以让我相信在Spring上花费时间是值得的。

    分享到:

    历史上的今天:

    Fedex Day 2013-04-01
    Hello,Redis 2010-04-01
    引用地址:

    评论

  • 项目组中的一个同事对我说,用Spring跟没用一样。原因是我们的代码并没有继承Spring中的类,也没有实现Spring中的接口。

    这恰好就是Spring的优势之一,这使得我们的应用不必困在Spring上。依赖于特定的API就意味着要在一棵树上吊死。

    这句话:有失偏颇。如果你把spring

    就只用core ,就把他当作是配置器,你可以这样说,但是spring 还有其它好多功能,如果用这些功能,还是要用到他的api 的。老大。
  • 认识的很深刻和透彻!spring照亮了框架的未来!
  • 好奇怪,为什么Spring的AOP概念你没有涉及到,我想IOC和AOP应该是两个概念吧!:)
    回复minikiller说:
    原因很简单,我没有实际应用。所以,我只在开阔视野中简单的提了一下。
    2004-06-07 19:04:55
  • 能具体讲讲么,为什么成了反模式?
  • 不幸的是,到了J2EE的世界,由于classloader的原因,它几乎成了一个经典的反模式。曾经在自己的代码中大量运用Singleton,部署中遇到的问题加上太多的重复代码,给我留下了一段不堪回首的经历
  • 看到这末多人的应用,让我们也更加坚定了推进spring的使用
  • 写得非常好,如沐春风的感觉
  • 可是如果一个项目已经在没有单元测试的环境里开发了很长时间,而且它的环境也确实不方便进行测试(一个单元测试要十分钟才能看到结果,我公司的项目就是如此),我该如何用这种IoC的设计来改进它呢?如果您能指导我一下,我会非常开心,没有单元测试日子过的太可怕了…… :)
  • 欣喜若狂,如果不是在公司,我就要大笑了……
  • 好文,好文。很多东西真是很有见解:)
  • that's great!
  • Cool,
    回复yanger说:
    Thanks!
    2004-04-02 21:20:29
  • 写得真漂亮,佩服
    回复透明说:
    呵呵,过奖了!
    2004-04-02 19:34:01