版權與免責聲明:本博客文章翻譯自《Spring in action》第三版,原書版權歸原做者及其出版單位全部,本人僅出於我的興趣,翻譯其中內容。本人不以盈利爲目的,放置在博客中僅爲了方便網友閱讀原做遇到困難時參考。本人嚴正聲明,本人並不擁有翻譯該做品之正當權力,所以嚴禁他人轉載,亦不保證做品之正確性;如侵犯您的權益,望告知,即行關閉。java
翻譯聲明:本人目前計劃天天翻譯兩頁,且不作任何工期承諾,以前未在網上發現相似內容,如已有類似內容,望告知,也免得我翻譯了。spring
Bean不是惟一的稱呼…… 儘管Spring大量地使用單詞bean和JavaBean來指代應用程序組件,可是不要望文生義地覺得一個Spring組件就必須遵循JavaBeans規範。一個Spring組件能夠是任何形式的POJO。在本書中,我採用廣義上的JavaBean,即POJO的同義詞。編程
縱覽本書,你將發現,Spring神通廣大。可是支撐Spring絕大部分功能的根基實際上是少量基本理念,它們專一於Spring的基本任務:簡化Java開發。設計模式
這是一份莊重的承諾!不少框架都聲稱簡化這樣或那樣的事情,可是Spring致力於全方位地簡化Java開發。這有待於細細解釋。Spring是如何簡化Java開發的?session
爲了下降Java的複雜性,Spring採起了如下四項核心策略:框架
· 採用普通簡單Java對象(POJO)保持輕量級和最低限度侵入開發測試
· 經過依賴注入和麪向接口下降耦合spa
· 經過切面和慣例進行聲明式編程翻譯
· 經過切面和模板減小冗餘設計
Spring所作的幾乎一切事情均可以追溯到上述一個或多個策略。在本章的其餘部分,我將對這些理念展開論述,並經過具體實例展示Spring是如何較好地兌現簡化Java開發這一承諾的。咱們先來看一看Spring是如何經過鼓勵面向POJO開發來保持最低限度侵入的。
1.1.1 激發POJO的潛能
若是你是Java開發的老手,你或許見過(甚至使用過)這樣的框架,它們強迫你去擴展它們提供的類,或實現它們的接口,從而將你牢牢束縛住。下面這個經典的示例,是EJB-2時代的無狀態會話bean。從這個繁瑣的HelloWorldBean中你能夠發現,EJB2規範實在是太過於臃腫了。
package com.habuma.ejb.session; import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class HelloWorldBean implements SessionBean { public void ejbActivate() { } public void ejbPassivate() { } public void ejbRemove() { } public void setSessionContext(SessionContext ctx) { } public String sayHello() { return "Hello World"; } public void ejbCreate() { } }
SessionBean接口容許你經過實現若干生命週期回調方法(這些方法以ejb打頭),嵌入EJB的生命週期內。或許我應該這麼說,SessionBean接口強迫你嵌入EJB的生命週期內,即使你不須要。HelloWorldBean中的大段代碼僅僅是爲了知足框架的須要。那麼問題是:到底誰在爲誰服務?
EJB2的侵入式特性並不是特例。其餘流行框架,好比Struts,WebWork和Tapestry的早期版本也都和其餘簡單Java類糾纏不清(imposed themselves upon otherwise simple Java classes)。這些重量級框架,強迫開發者編寫混雜了冗餘代碼的類,這些類被束縛在框架之中,一般也很難編寫相應的測試。
Spring竭力避免讓你的應用程序代碼與它的API相混雜。Spring幾乎從不強制你實現一個Spring接口,或者擴展一個Spring類。事實上,基於Spring的應用程序中的類一般沒有跡象顯示它們正在被Spring所使用。最壞的狀況下,一個類或許加註了Spring的註解,但它仍舊是一個POJO。
爲了闡明這一點,若是清單1.1中展現的HelloWorldBean要被重寫爲Spring管理的bean,它看起來可能會是這樣:
package com.habuma.spring; public class HelloWorldBean { public String sayHello() { return "Hello World"; } }
難道不是好得多嗎?那些惱人的生命週期方法都不見了。HelloWorldBean沒有實現、擴展或者導入任何Spring API的內容。HelloWorldBean是簡練的,清晰的,總的來講,是一個普通簡單Java對象。
POJO形式縱然簡單,但功能能夠很是強大。Spring強化POJO的方法之一就是使用依賴注入。讓咱們看看依賴注入是如何幫助應用程序的對象彼此解耦的。
1.1.2 注入依賴關係
依賴注入這個詞讓人望而生畏,它成爲了一項複雜的編程技巧或設計模式的理念。可是事實證實,依賴注入(DI)並無聽上去那麼複雜。