首頁
中文書目錄
原文書目錄
 站內快速搜尋
資源中心
Book Series
Special Interest













■好消息,歐萊禮書籍已重新鋪貨至各大書局及網路書店,歡迎讀者選購       ■歡迎各院校採用歐萊禮書籍,學校團購請洽校園服務團隊

[書籍導讀]

Spring 程式高手秘笈
— 在此 J2EE 發展的解凍期,你是否體會到空氣中一種難以形容的能量?那就是「春天」的魔力。

「春天」的魔力

在 Java 社群裡,我們正處於另一種形式的春天,它隨著 EJB(2.x)的嚴寒期而來。數以萬計的應用程式,正身陷出於好意,實際卻異常冰冷、令人窒息的冰天雪地裡。如果不夠細心,EJB 將反噬應用程式的生命。無庸置疑地,J2EE 是個非常龐大的架構,EJB 也一直被視為 J2EE 平台的核心,這種觀點似乎過於看重 EJB 的地位。在此,我們無意評斷 EJB 的功過得失,僅以 Pareto 法則(80/20 法則,在此甚至是 90/10)來考量,是否應該在一些沒必要使用 EJB 的專案中,找到更好、更簡單、更具效率的替代方案。如果下列的要點是你的系統所重視的,你或許應該想想其他對策:
  • 儘管開發人員使用自動化測試,也無法為EJB應用程式做很好的測試。因為 Container 太大,很難在測試案例中啟動,而且物件也無法在 Container 外執行,造成整個開發時程拉長。
  • EJB 是被設計用來保護商業物件,而不需擔心交易、永續保存、安全、遠端呼叫與訊息傳遞等服務的細節。然而,由於 EJB 應用程式開發不易,需透過強大的 Java IDE,程式碼產生器等開發工具來幫忙,再加上不同廠商的 Application Server 也造成不同問題,稍有不慎,你的應用程式便淪為 EJB 的奴隸。
  • 從抽象化的物件設計來看,Entity Bean 很難直接表示 Domain Object 的需求,因為它在 ORM 機制上仍有不少限制,不易表達資料表間較複雜的關連性。取而代之的是,使用輕薄短小又實用的 iBATIS、JDO、Hibernate 等架構,以發揮 ORM 的功能。
  • 對許多人而言,EJB 所帶來的痛苦是值得的,因為其宣告式服務,像是交易和遠端呼叫,是很有價值的。把這些服務從主要的商業邏輯切開,可以讓應用程式更簡單、更乾淨,也更容易維護。但是如果宣告式服務這麼重要,為什麼只使用 Container 所提供的宣告式服務呢?為什麼不設計出更一般性的模型,讓服務可以很容易被附加到任何的 POJO(Plain Old Java Object)呢?在 Spring 中,只要在 XML 裡加上幾行文字,就可以讓物件擁有安全、遠端呼叫、或交易等服務(當然,POJO 也有其缺點,因為透過宣告組態的方式來定義物件之間的關聯性,面對規模較大的系統時,維護冗長複雜的組態檔也是不易)。
  • 你想幾乎不費吹灰之力就讓系統與一些很棒的開放原始碼合作(像是 Apache Struts,Hibernate 等等)。
  • 既使你的程式與 EJB 無關,但你想讓你的程式具有良好且有彈性的架構,讓所有開發人員在一致的思維下共同開發程式。
Java 開發人員都知道,就 J2EE 的目的與精神而言,J2EE 應用程式開發理應簡單,然而,以現況看來,事實卻非如此!那麼,該怎麼辦呢?在蹣跚行走數年後,經歷了龐大的 EJB 架構,Java 社群已經準備好迎接「春天」的來臨。在此時點上,Spring 提供了這樣的一個替代方案,相較於過去,你將會更快地適應它。繼 Hibernate 後,Spring 的出現為 Java 開放原始碼世界注入一股令人振奮的力量,其完整又務實的架構確實解決了 J2EE 長久存在的一些問題。

Spring 克服了 J2EE 的贅餘層次,再次讓開發企業應用程式變得簡單,幫助你設計出輕量化的應用程式,又可以勝任重量級的工作:把心力放在重要的撰碼上,而不是去寫那些讓容器能正確執行的介面與佈署描述文件。你將寫出容易測試和佈署的 POJO,而不是寫只能在複雜容器中存活的特定元件。從 GUI 及 Web 前端程式,一直到存取關聯式資料庫的後端程式,皆有充分的支援。只要在組態設定檔中加上幾行,就可以把一些像交易和安全這類的服務,注入應用程式裡。

近來,在許多不同的產業與技術環境裡,大型企業開始使用 Spring。Spring 為歐洲與北美一些大型銀行的關鍵性應用程式提供了動力,Spring 驅動了物流應用程式,以及幾個主要大學的註冊與採購系統,Spring 也為一些領導級的科學研究組織所採用。Spring 更促進了網格式運算(Grid Computing)、商業關係、以及數不盡的新興企業的發展。要瞭解箇中原因很容易:
  • Spring 比傳統的 J2EE 簡單許多。使用 Spring 時,你能把應用程式寫成 POJO(Plain Old Java Object)的形式,卻還能享有複雜的交易、資料存取、與安全等服務。
  • Spring 讓應用程式更容易測試。既然元件是 POJO 的形式,你可以在 Container 之外執行它們。因為 Spring 使用了重要的現代化觀念,像是 Aspect 導向程式設計(Aspect-Oriented Programming,AOP)以及鬆綁程式耦合性的相依性注入(Dependency Injection)。因為 Container 變得又快又輕,可以很容易地執行整合性測試。
  • Spring 協助你移除程式碼中的相依性,並去除與環境(例如應用程式伺服器)及 Spring Container 本身之間的耦合性。這將確保你在程式碼智慧財產上所作的投資。
  • 當然,由於 Spring 是分層化架構(見下一節),且每一層皆定義良好,你甚至可單單使用某幾層,幫你完成工作。例如,單單使用 Spring ORM,幫你管理好 Persistence 的工作。
  • Spring 每一層的程式碼架構,都是非常具有一致性(consistent),因此在你熟悉當中之一後,將發現你的學習曲線是很具效率的。
另外,一些像是輕量化 Container、Aspect-Oriented 程式設計(AOP)、以及控制逆轉(IoC)的概念,都是出了名令人困惑且困難的。然而,在 Spring 的世界裡,它們卻是既簡單又具有威力 - 特別是對那些曾經在混亂的 J2EE 世界中掙扎過的人,必定認為 Spring 是一個很好的解決方案。

Spring 的技術要點

■ 七大模組:

Spring 包含了許多功能和特色,由 7 個組織良好的模組所組成。Spring模組建構在核心容器(core container)之上,核心容器定義了在 Spring 裡,bean 的建立、組態和管理方式。(下圖形摘錄自 Spring Framework 2.0 Reference Manual,〔參考資料 5〕:)




  • Core 套件:提供 Spring 架構的最基本功能,構成 Core Container 的主體,Core Container 的主要元件是 BeanFactory,它是 Factory Pattern 的複雜實作。BeanFactory使用控制反轉(IoC)模式,去除應用程式組態、物件相依性與實際的程式碼間的耦合。
  • Context 套件:為 Spring 架構提供 Context 資訊,提供一種類似 JNDI-registry 的方式以存取 bean。Context 套件 beans 套件繼承一些功能,並增加 I18N,事件傳播等支援。
  • AOP 套件:透過組態管理的功能,Spring AOP 模組將 Aspect 導向的程式設計直接整合到 Spring 架構中。因而可以很容易讓 Spring 架構管理的任何物件支援AOP。Spring AOP 模組為 Spring 應用程式,提供交易管理服務。透過使用 Spring AOP,不用依賴 EJB 元件,就可以將宣告性交易管理整合到應用程式中。
  • DAO 套件:JDBC DAO 抽象層提供有意義的異常階層結構,用以管理異常處理和不同資料庫廠商拋出的錯誤訊息。異常階層結構簡化了錯誤處理,並且大大降低需要撰寫的異常程式碼數量。
  • ORM 套件:Spring 架構內含數個 ORM 架構,包括 JDO、Hibernate 和 iBatis。這些全都遵從 Spring 的交易服務和異常階層結構。
  • Web 套件:Web context 模組建立在應用程式 context 模組上,為 Web 應用程式提供 context。所以,Spring 架構支援與 Jakarta Struts 的整合。Web 模組也簡化了 multi-part 請求的處理,以及將請求參數繫結到 domain object 的工作。
  • MVC 套件:提供了一個建構 Web 應用程式的全功能 MVC 實作。透過策略介面,MVC 模組成為高度可組態,也容納了大量的表現層技術,包括 JSP、Velocity、Tiles、iText 和 POI。

■ 分層化架構:

Spring 的優勢之一就是分層化架構(layered architecture),組成 Spring 的每個模組都可以單獨存在,或者與其他一個或多個模組聯合實作。因此,你能夠以多種組合方式,依實際狀況所需,運用一或多個模組,形成多種 usage scenario。以下圖形代表其中一種,也是完整的運用方式(摘錄自 Spring Framework 2.0 Reference Manual,〔參考資料 5〕):



以下是另一種運用方式:




當然,由於是分層化架構,且每一層皆定義良好,你甚至可只用核心層及Spring ORM,單單幫你管好Persistence的工作。

■ IoC 和 AOP:

IoC:控制反轉模式(Inversion of Control pattern,也稱作依賴性介入(dependency injection))的基本概念是:不建立物件,但是描述物件建立的方式。在程式碼中不直接連結元件與服務,而是在組態檔裡描述哪個元件需要哪項服務。在 Spring 架構的 IoC 容器負責將這些聯繫在一起。

AOP:Aspect 導向程式設計,是 OOP 的一種補充或改進。將 OOP 應用到現實世界時,時常發現系統中各類別會有許多共同使用的邏輯或責任(例如日誌管理、權限控制、排程處理等),這些「服務」不斷重複地「切入」各類別中。如果功能流程是縱向的,這些切入點就是所謂的 Point-cut;而在此提供服務的額外程式碼就是所謂的 Advice。簡言之,Point-cut 與 Advice 的組合就成了 Aspect,就是這些共同使用的邏輯或責任的封裝。透過 AOP,可將程式的責任釐清,物件與Aspect 互不干擾。另外,Aspect 的模組並非外顯地為物件所用,而是透過相依性注入或攔截等方式,而獲得被封裝物件內部的方法與訊息,所以,用 Spring AOP 編寫的應用程式碼是鬆散耦合的。

■ POJO::

Plain Old/Ordinary Java Object,其實就是一般的 Java Class。Spring 的核心哲學之一,就是希望開發人員能以最單純的方式,直接撰寫一般的 Java Class 程式。過去,為讓開發人員專心於商業邏輯,希望 Container 越強越好,讓 Container 管理交易、快取、永續保存等一堆"鎖事"。但是 EJB 的設計,卻讓開發人員要額外處理更多特有的介面、類別、組態等,而且沒有 J2EE Container 就跑不動。開發、維護、與測試的代價實在太高了。因此,像 Spring 這種 Light-weight container 開始出現,強調只要寫 POJO,寫一些簡單的組態檔,就可以達到強大的 J2EE Container 希望的目標。

本書的價值

  • 關於 Spring 的好書,目前確實有幾本,例如,Professional Java Development with the Spring FrameworkPro Spring,與 Spring in Action 等,(上述第一本的Lead author 還是 Spring Framework 的創造者 Rod Johnson),這些書對 Spring 從理論,架構到範例,都解釋得比本書好或仔細,然而,這些書大約都是五百到八、九百頁的篇幅。很明顯地,「輕量化」架構可不表示「簡單」的架構,從理論談到實例,這樣的篇幅不算誇張。而這本 Spring - A Developer's Notebook 的企圖,就是在僅僅一、二百頁的內容裡,提供入門 Spring Framework 的好方法,以具效率的方式帶領讀者一步步經歷各個重要的開發活動(從前端到後端都有談到)。如 Rod Johnson 在本書的序言中所提,你會看到許多程式碼範例,精確地描述如何使用 Spring 應付常見的需求。雖然 Spring 已經有非常多且持續增加的文獻資料,然而,這本書卻填補了一個重要的缺口:如果你對 Spring 很陌生,又想在很短的時間內熟悉它,就需要這本書。
  • 雖然本書篇幅精簡,仍對 Spring 的整體精神做了一定程度的說明,而且都是有範例的:
    - 使用 Inversion of Control 簡化類別間的關聯(使用Dependency Injection)。
    - 使用 Aspects 增加像是交易和安全這類的服務。
    - 整合 JDBC 與 iBatis、JDO、Hibernate 等永續保存服務。
    - 使用 Spring MVC 與 Spring Rich,建立 Web 前端程式與 Rich Client。
    - 整合 Struts 及 JSF 這類開發架構使用 Spring。
    - 交易與安全(ACEGI)。
    - 訊息傳遞與遠端呼叫。
    - 使用 EasyMock在Containe r外執行測試案例。
  • 本書的作者 Bruce A. Tate 與 Justin Gehtland「輕快的好 Java」一書的作者,該書在 2005 年贏得 JOLT 大獎。這本書則是延續他們在「輕量化」技術上的研究。
  • 平心而論,這本書的優點在於篇幅,缺點也在於篇幅。還記得前面另一篇 Hibernate - A Developer's Notebook 的書評?A Developer's Notebook 系列讓讀者以最有效率的方式,學習最實用的技巧。Hibernate - A Developer's Notebooku 一書,的確達到了鞭辟入裡之效,且真的能在「度個假」後,就能掌握要點付諸實現。然而,相對於 Hibernate,Spring 這個主題實在不小,想在這本小書中仔細詳解是有困難的,因此書中的解釋的確有不足之處,讀者需要一些基礎,或是額外作些功課。這是本書先天的限制,還好,用心的讀者可從範例程式碼中,獲得補償。
  • 對於 Java 開發者,甚至是涉略 J2EE 一段時間的讀者,閱讀本書不失為一個練功的好機會,為你以前所累積的程式思維做個沉澱與反思。既使你不需使用Spring 或是 EJB,Spring 絕對是程式設計者的一門好內功。

如何使用本書

以同為讀者的立場而言,筆者建議:如前所述,由於本書以實例逐步說明,對 Spring 的理論與架構著墨不多,若您對 Spring 的瞭解有限,在閱讀本書前,你可以先閱讀下列參考資料 [1]~[4],建立基礎概念,這對閱讀本書的效率而言會有一些幫助。

另外,在閱讀本書後,你可以閱讀下列參考資料 [5],以求對 Spring 有更完整的知識,也因為你已閱讀過本書,參考資料 [5] 或是上述幾本大篇幅的好書,對你也將較為具體且容易。

參考資料

[1] The Spring series, Part 1: Introduction to the Spring frameworkNaveen Balani
http://www-128.ibm.com/developerworks/web/library/wa-spring1/
[2] The Spring series, Part 2: When Hibernate meets SpringNaveen Balani
http://www-128.ibm.com/developerworks/web/library/wa-spring2/
[3] The Spring series, Part 3: Swing into Spring MVC,Naveen Balani
http://www-128.ibm.com/developerworks/web/library/wa-spring3/
[4] The Spring series, Part 4: 1-2-3 messaging with Spring JMS Naveen Balani
http://www-128.ibm.com/developerworks/web/library/wa-spring4/
[5] Spring Reference Documentation,Java/J2EE Application Framework,
http://static.springframework.org/spring/docs/1.2.x/reference/index.html


楊仁和
06/08/2006

| 首頁 | 聯絡我們 |
© 2009, O'Reilly Media, Inc. Taiwan Branch