用Spring有一段時間了,最近在部門內(nèi)部做個Spring的培訓,一個很自然的問題出現(xiàn)大腦
之中,Spring好在哪?
我可以擺出許多廣告,但那不是我的感覺。于是,我向自己發(fā)問,要求一個屬于自己的答
案
Dependency Injection
原來,它叫IoC。Martin Flower發(fā)話了,是個框架都有IoC,這不足以新生容器反轉的“如
何定位插件的具體實現(xiàn)”,于是,它有了個新名字,Dependency Injection。
其實,它就是一種將調(diào)用者與被調(diào)用者分離的思想,Uncle Bob管它叫DIP(Dependency I
nversion Principle),并把它歸入OO設計原則。
同Spring相比,它更早進入我的大腦。一切都是那么朦朧,直至Spring出現(xiàn)。
慢慢的,我知道了它還分為Interface Injection(type 1),Setter Injection(type
2),Constructor Injection(type 3)。Martin Flower那篇為它更名的大作讓我心目關
于它的一切趨于完整。
在Spring中,它是一切的基礎。Spring的種種優(yōu)勢隨之而來。
于我而言,它為我?guī)砀嗟氖撬季S方式的轉變,恐怕以后我再也無法寫出那種一大塊的
全功能程序了。
動態(tài)配置
這里提及的動態(tài)配置包括兩個部分:系統(tǒng)的生成和系統(tǒng)的修改。
基于Spring的應用是依賴配置文件組織起來的,這意味著我們所編寫的程序,更多的是在
完成具體的功能,而各個功能之間的串連,就要靠配置文件了。
隨之而來的一個好處就是,我們可以在不重新編譯代碼的情況下,改變系統(tǒng)行為。
或許不修改代碼可以成為另一個理由,但在我看來,修改Java代碼和修改配置文件沒有什
么本質(zhì)區(qū)別,只要能把配置文件視為另一種語言,不是嗎?
有位同事問我,Spring的配置文件的正確性是否只有運行時才能發(fā)現(xiàn),道理上講是這樣的
。每次修改配置文件,然后跑起來確定其正確性,這確實是一件費力不討好的事。如果你
是Eclipse的用戶,你就幸福多了,已經(jīng)有人開發(fā)了Spring的插件協(xié)助你完成這個工作。
易測的結構
曾經(jīng)有一次在現(xiàn)場,我改一個簡單的小bug,簡單到加在一起改的代碼不超過五行。但從我
定位到錯誤到完全把bug修正,用了兩個多小時,這使得兩個同伴最后只能對我怒目而視。
這其中固然有我自己糊涂的原因,代碼不可測也是很重要的一個原因。每次修改了一句話
,就要部署到應用服務器上,運行起來看結果。相信每個有在應用服務器上部署應用經(jīng)驗
的人都知道那是多么漫長的過程。
如果以前對我說,對于一個好的應用來說,可測試性也非常重要,我擺出一副非常不屑的
態(tài)度,慘痛的教訓徹底的教育了我。
Dependency Injection讓整個應用結構清楚了許多,我們可以針對每個具體的模塊進行單
元測試,而不必像過去一樣,只有把整個應用部署到應用服務器上運行起來之后,才能測
試。
局部的穩(wěn)定帶來的是更多的信心,當系統(tǒng)一點點整合在一起,信心就越來越足。
不存在的接口壓力
項目組中的一個同事對我說,用Spring跟沒用一樣。原因是我們的代碼并沒有繼承Spring
中的類,也沒有實現(xiàn)Spring中的接口。
這恰好就是Spring的優(yōu)勢之一,這使得我們的應用不必困在Spring上。依賴于特定的API就
意味著要在一棵樹上吊死。我們原來系統(tǒng)中很難測試的另一個原因就是在代碼中遍布Http
ServletResponse,這使得我們的代碼只有放在Web容器中才能跑起來。
Rod Johnson在評價一個Web框架的優(yōu)劣時,將是否依賴于Servlet API作為一個及其重要的
標準。
依賴于特定API就意味著要依賴于特定的容器或是框架,就像Servlet一定要跑在Web Cont
ainer里,EJB一定要有AppServer一樣。
沒有了接口的壓力,使得我們應用可以完全脫離Spring運行。在系統(tǒng)開發(fā)期間,我不斷強
調(diào)即便沒有Spring,我們的應用依然可以自行組裝來運行,給我這種底氣的理由就是Spri
ng沒有侵略性的接口。另一個原因是當時我并沒有對把整個系統(tǒng)放到Spring上有十足的把
握。^_^
消除Singleton
Singleton是二十三個經(jīng)典的設計模式之一,不幸的是,到了J2EE的世界,由于classload
er的原因,它幾乎成了一個經(jīng)典的反模式。曾經(jīng)在自己的代碼中大量運用Singleton,部署
中遇到的問題加上太多的重復代碼,給我留下了一段不堪回首的經(jīng)歷。
Spring的出現(xiàn)漂亮的解決這個問題,我只要在配置文件中配置一個bean,它缺省行為就是
Singleton,我不必再為反模式抓空心思,不必再為了Singleton編碼。
擇其善者而從之
不同于很多技術,Spring并不是一個“要么全部,要么沒有”的東西,它是一個分層的結
構。我們可以從中選取我們感興趣的部分,而不必理會其它的部分。我用得最多的部分就
是Spring的Core部分,也就是基于bean的配置框架,對于其上的MVC、ORM、DAO等等,我并
不了解,但這絲毫不影響我的運用。
開闊視野
Spring本身包含很多的東西,從Dependency Injection之類思想性的東西,到現(xiàn)在頗為流
行的AOP、ORM之類實現(xiàn)技術。在Spring的路線圖中,JMX、JMS、JCA等等已經(jīng)都納入了Spr
ing未來的發(fā)展計劃中。于我而言,沉浸于Spring的世界里,一段時間內(nèi)不愁沒東西可學。
Spring起源于Rod Johnson的《Expert One-on-One J2EE Design and Development》,所
以,這本書成了Spring最好的輔導材料。書中的許多觀點的提出完全是基于Rod本人的實際
經(jīng)驗,比起不少假大空的理論或是廣告來得實際得多。Spring郵件列表中有人這樣評價,
這本書值得“cover-to-cover”的讀。如果你和曾經(jīng)的我一樣,迷失于J2EE紛繁復雜的世
界中,這是一劑讓你清醒過來的良藥。
這就是我眼中的Spring,這些理由比之許多Spring的廣告顯得單薄許多,因為我對Spring
的了解實在有限,但這足以讓我相信在Spring上花費時間是值得的。