用Spring有一段时间了,最近在部门内部做个Spring的培训,一个很自然的问题出现大脑
之中,Spring好在哪?
我可以摆出许多广告,但那不是我的感觉。于是,我向自己发问,要求一个属于自己的答
案
Dependency Injection
原来,它叫IoC。Martin Flower发话了,是个框架都有IoC,这不足以新生容器反转的“如
何定位插件的具体实现”,于是,它有了个新名字,Dependency Injection。
其实,它就是一种将调用者与被调用者分离的思想,Uncle Bob管它叫DIP(Dependency I
nversion 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就
意味着要在一棵树上吊死。我们原来系统中很难测试的另一个原因就是在代码中遍布Http
ServletResponse,这使得我们的代码只有放在Web容器中才能跑起来。
Rod Johnson在评价一个Web框架的优劣时,将是否依赖于Servlet API作为一个及其重要的
标准。
依赖于特定API就意味着要依赖于特定的容器或是框架,就像Servlet一定要跑在Web Cont
ainer里,EJB一定要有AppServer一样。
没有了接口的压力,使得我们应用可以完全脱离Spring运行。在系统开发期间,我不断强
调即便没有Spring,我们的应用依然可以自行组装来运行,给我这种底气的理由就是Spri
ng没有侵略性的接口。另一个原因是当时我并没有对把整个系统放到Spring上有十足的把
握。^_^
消除Singleton
Singleton是二十三个经典的设计模式之一,不幸的是,到了J2EE的世界,由于classload
er的原因,它几乎成了一个经典的反模式。曾经在自己的代码中大量运用Singleton,部署
中遇到的问题加上太多的重复代码,给我留下了一段不堪回首的经历。
Spring的出现漂亮的解决这个问题,我只要在配置文件中配置一个bean,它缺省行为就是
Singleton,我不必再为反模式抓空心思,不必再为了Singleton编码。
择其善者而从之
不同于很多技术,Spring并不是一个“要么全部,要么没有”的东西,它是一个分层的结
构。我们可以从中选取我们感兴趣的部分,而不必理会其它的部分。我用得最多的部分就
是Spring的Core部分,也就是基于bean的配置框架,对于其上的MVC、ORM、DAO等等,我并
不了解,但这丝毫不影响我的运用。
开阔视野
Spring本身包含很多的东西,从Dependency Injection之类思想性的东西,到现在颇为流
行的AOP、ORM之类实现技术。在Spring的路线图中,JMX、JMS、JCA等等已经都纳入了Spr
ing未来的发展计划中。于我而言,沉浸于Spring的世界里,一段时间内不愁没东西可学。
Spring起源于Rod Johnson的《Expert One-on-One J2EE Design and Development》,所
以,这本书成了Spring最好的辅导材料。书中的许多观点的提出完全是基于Rod本人的实际
经验,比起不少假大空的理论或是广告来得实际得多。Spring邮件列表中有人这样评价,
这本书值得“cover-to-cover”的读。如果你和曾经的我一样,迷失于J2EE纷繁复杂的世
界中,这是一剂让你清醒过来的良药。
这就是我眼中的Spring,这些理由比之许多Spring的广告显得单薄许多,因为我对Spring
的了解实在有限,但这足以让我相信在Spring上花费时间是值得的。