天天看點

《Spring實戰(第4版)》——1.3 俯瞰Spring風景線

本節書摘來自異步社群《spring實戰(第4版)》一書中的第1章,第1.3節,作者: 【美】craig walls(沃爾斯)著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

正如你所看到的,spring架構關注于通過di、aop和消除樣闆式代碼來簡化企業級java開發。即使這是spring所能做的全部事情,那spring也值得一用。但是,spring實際上的功能超乎你的想象。

在spring架構的範疇内,你會發現spring簡化java開發的多種方式。但在spring架構之外還存在一個建構在核心架構之上的龐大生态圈,它将spring擴充到不同的領域,例如web服務、rest、移動開發以及nosql。

首先讓我們拆開spring架構的核心來看看它究竟為我們帶來了什麼,然後我們再浏覽下spring portfolio中的其他成員。

1.3.1 spring子產品

當我們下載下傳spring釋出版本并檢視其lib目錄時,會發現裡面有多個jar檔案。在spring 4.0中,spring架構的釋出版本包括了20個不同的子產品,每個子產品會有3個jar檔案(二進制類庫、源碼的jar檔案以及javadoc的jar檔案)。完整的庫jar檔案如圖1.6所示。

《Spring實戰(第4版)》——1.3 俯瞰Spring風景線

圖1.6 spring架構由20個不同的子產品組成

這些子產品依據其所屬的功能可以劃分為6類不同的功能,如圖1.7所示。

總體而言,這些子產品為開發企業級應用提供了所需的一切。但是你也不必将應用建立在整個spring架構之上,你可以自由地選擇适合自身應用需求的spring子產品;當spring不能滿足需求時,完全可以考慮其他選擇。事實上,spring甚至提供了與其他第三方架構和類庫的內建點,這樣你就不需要自己編寫這樣的代碼了。

《Spring實戰(第4版)》——1.3 俯瞰Spring風景線

圖1.7 spring架構由6個定義良好的子產品分類組成

讓我們逐一浏覽spring的子產品,看看它們是如何建構起spring整體藍圖的。

spring核心容器

容器是spring架構最核心的部分,它管理着spring應用中bean的建立、配置和管理。在該子產品中,包括了spring bean工廠,它為spring提供了di的功能。基于bean工廠,我們還會發現有多種spring應用上下文的實作,每一種都提供了配置spring的不同方式。

除了bean工廠和應用上下文,該子產品也提供了許多企業服務,例如e-mail、jndi通路、ejb內建和排程。

所有的spring子產品都建構于核心容器之上。當你配置應用時,其實你隐式地使用了這些類。貫穿本書,我們都會涉及到核心子產品,在第2章中我們将會深入探讨spring的di。

spring的aop子產品

在aop子產品中,spring對面向切面程式設計提供了豐富的支援。這個子產品是spring應用系統中開發切面的基礎。與di一樣,aop可以幫助應用對象解耦。借助于aop,可以将遍布系統的關注點(例如事務和安全)從它們所應用的對象中解耦出來。

我們将在第4章深入探讨spring對aop支援。

資料通路與內建

使用jdbc編寫代碼通常會導緻大量的樣闆式代碼,例如獲得資料庫連接配接、建立語句、處理結果集到最後關閉資料庫連接配接。spring的jdbc和dao(data access object)子產品抽象了這些樣闆式代碼,使我們的資料庫代碼變得簡單明了,還可以避免因為關閉資料庫資源失敗而引發的問題。該子產品在多種資料庫服務的錯誤資訊之上建構了一個語義豐富的異常層,以後我們再也不需要解釋那些隐晦專有的sql錯誤資訊了!

對于那些更喜歡orm(object-relational mapping)工具而不願意直接使用jdbc的開發者,spring提供了orm子產品。spring的orm子產品建立在對dao的支援之上,并為多個orm架構提供了一種建構dao的簡便方式。spring沒有嘗試去建立自己的orm解決方案,而是對許多流行的orm架構進行了內建,包括hibernate、java persisternce api、java data object和ibatis sql maps。spring的事務管理支援所有的orm架構以及jdbc。

在第10章讨論spring資料通路時,你會看到spring基于模闆的jdbc抽象層能夠極大地簡化jdbc代碼。

本子產品同樣包含了在jms(java message service)之上建構的spring抽象層,它會使用消息以異步的方式與其他應用內建。從spring 3.0開始,本子產品還包含對象到xml映射的特性,它最初是spring web service項目的一部分。

除此之外,本子產品會使用spring aop子產品為spring應用中的對象提供事務管理服務。

web與遠端調用

mvc(model-view-controller)模式是一種普遍被接受的建構web應用的方法,它可以幫助使用者将界面邏輯與應用邏輯分離。java從來不缺少mvc架構,apache的struts、jsf、webwork和tapestry都是可選的最流行的mvc架構。

雖然spring能夠與多種流行的mvc架構進行內建,但它的web和遠端調用子產品自帶了一個強大的mvc架構,有助于在web層提升應用的松耦合水準。在第5章到第7章中,我們将會學習spring的mvc架構。

除了面向使用者的web應用,該子產品還提供了多種建構與其他應用互動的遠端調用方案。spring遠端調用功能內建了rmi(remote method invocation)、hessian、burlap、jax-ws,同時spring還自帶了一個遠端調用架構:http invoker。spring還提供了暴露和使用rest api的良好支援。

我們将會在第15章讨論spring的遠端調用功能。在第16章學習如何建立和使用rest api。

instrumentation

spring的instrumentation子產品提供了為jvm添加代理(agent)的功能。具體來講,它為tomcat提供了一個織入代理,能夠為tomcat傳遞類檔案,就像這些檔案是被類加載器加載的一樣。

如果這聽起來有點難以了解,不必對此過于擔心。這個子產品所提供的instrumentation使用場景非常有限,在本書中,我們不會介紹該子產品。

測試

鑒于開發者自測的重要性,spring提供了測試子產品以緻力于spring應用的測試。

通過該子產品,你會發現spring為使用jndi、servlet和portlet編寫單元測試提供了一系列的mock對象實作。對于內建測試,該子產品為加載spring應用上下文中的bean集合以及與spring上下文中的bean進行互動提供了支援。

在本書中,有很多的樣例都是測試驅動的,将會使用到spring所提供的測試功能。

1.3.2 spring portfolio

當談論spring時,其實它遠遠超出我們的想象。事實上,spring遠不是spring架構所下載下傳的那些。如果僅僅停留在核心的spring架構層面,我們将錯過spring portfolio所提供的巨額财富。整個spring portfolio包括多個建構于核心spring架構之上的架構和類庫。概括地講,整個spring portfolio幾乎為每一個領域的java開發都提供了spring程式設計模型。

或許需要幾卷書才能覆寫spring portfolio所提供的所有内容,這也遠遠超出了本書的範圍。不過,我們會介紹spring portfolio中的一些項目,同樣,我們将體驗一下核心架構之外的另一番風景。

spring web flow

spring web flow建立于spring mvc架構之上,它為基于流程的會話式web應用(可以想一下購物車或者向導功能)提供了支援。我們将在第8章讨論更多關于spring web flow的内容,你還可以通路spring web flow的首頁。

spring web service

雖然核心的spring架構提供了将spring bean以聲明的方式釋出為web service的功能,但是這些服務是基于一個具有争議性的架構(拙劣的契約後置模型)之上而建構的。這些服務的契約由bean的接口來決定。 spring web service提供了契約優先的web service模型,服務的實作都是為了滿足服務的契約而編寫的。

spring security

安全對于許多應用都是一個非常關鍵的切面。利用spring aop,spring security為spring應用提供了聲明式的安全機制。你将會在第9章看到如何為應用的web層添加spring security功能。同時,我們還會在第14章重新回到spring security的話題,學習如何保護方法調用。

spring integration

許多企業級應用都需要與其他應用進行互動。spring integration提供了多種通用應用內建模式的spring聲明式風格實作。

spring batch

當我們需要對資料進行大量操作時,沒有任何技術可以比批處理更勝任這種場景。如果需要開發一個批處理應用,你可以通過spring batch,使用spring強大的面向pojo的程式設計模型。

spring data

spring data使得在spring中使用任何資料庫都變得非常容易。盡管關系型資料庫統治企業級應用多年,但是現代化的應用正在認識到并不是所有的資料都适合放在一張表中的行和列中。一種新的資料庫種類,通常被稱之為nosql資料庫[2],提供了使用資料的新方法,這些方法會比傳統的關系型資料庫更為合适。

不管你使用文檔資料庫,如mongodb,圖資料庫,如neo4j,還是傳統的關系型資料庫,spring data都為持久化提供了一種簡單的程式設計模型。這包括為多種資料庫類型提供了一種自動化的repository機制,它負責為你建立repository的實作。

我們将會在第11章看到如何使用spring data簡化java persistence api(jpa)開發,然後在第12章,将相關的讨論拓展至幾種nosql資料庫。

spring social

社交網絡是網際網路領域中新興的一種潮流,越來越多的應用正在融入社交網絡網站,例如facebook或者twitter。如果對此感興趣,你可以了解一下spring social,這是spring的一個社交網絡擴充子產品。

不過,spring social并不僅僅是tweet和好友。盡管名字是這樣,但spring social更多的是關注連接配接(connect),而不是社交(social)。它能夠幫助你通過rest api連接配接spring應用,其中有些spring應用可能原本并沒有任何社交方面的功能目标。

spring mobile

移動應用是另一個引人矚目的軟體開發領域。智能手機和平闆裝置已成為許多使用者首選的用戶端。spring mobile是spring mvc新的擴充子產品,用于支援移動web應用開發。

spring for android

與spring mobile相關的是spring android項目。這個新項目,旨在通過spring架構為開發基于android裝置的本地應用提供某些簡單的支援。最初,這個項目提供了spring resttemplate的一個可以用于android應用之中的版本。它還能與spring social協作,使得原生應用可以通過rest api進行社交網絡的連接配接。

spring boot

spring極大地簡化了衆多的程式設計任務,減少甚至消除了很多樣闆式代碼,如果沒有spring的話,在日常工作中你不得不編寫這樣的樣闆代碼。spring boot是一個嶄新的令人興奮的項目,它以spring的視角,緻力于簡化spring本身。

spring boot大量依賴于自動配置技術,它能夠消除大部分(在很多場景中,甚至是全部)spring配置。它還提供了多個starter項目,不管你使用maven還是gradle,這都能減少spring工程建構檔案的大小。

在本書即将結束的第21章,我們将會學習spring boot。