天天看點

《Spring技術内幕》——1.4節Spring的應用場景

1.4 spring的應用場景

通過介紹spring架構設計,我們了解到spring是一個輕量級的架構。在spring這個一站式的應用平台或架構中,其中的各個子產品除了依賴ioc容器和aop之外,互相之間并沒有很強的耦合性。spring的最終目标是簡化應用開發的程式設計模型。它所提供的服務,可以貫穿應用到整個軟體中,從最上層的web ui到底層的資料操作,到其他企業資訊資料的內建,再到各種j2ee服務的使用,等等。這些企業應用服務,spring都通過其特有的ioc容器和aop子產品實作。在實作過程中,spring沒有把這種複雜性轉換成自己被使用的複雜性,這點無疑是成功的,同時大大拓寬了spring的應用場景。一方面,我們可以把spring作為一個整體來使用,另一方面,也可以各取所需,把spring的各個子產品拿出來獨立使用,這取決于我們對spring提供服務的具體需求。例如,這些需求可能來自一個完整的java ee企業應用開發需求,可以僅使用spring的某些子產品,如ioc容器。再如,我們可以使用spring內建其他的j2ee服務,如javamail、jms、jndi等,還可以在android應用環境,甚至在.net應用環境中使用spring。使用spring的時候,可以采用各種不同的方式,而對于這些方式的選擇,完全是由應用來決定的。因而,在對spring的使用中,我們看到應用很少依賴于spring特有的api,同時,由于spring本身的設計也是非常子產品化的,這樣,就為應用開發提供了ejb開發不曾提供的便利。

在java ee企業應用開發中,我們了解了使用spring最為基本的場景,也就是使用大家熟知的ssh架構來完成企業應用開發,進而取代傳統的ejb開發模式。在ssh架構中,struts作為web ui層、spring作為中間件平台、hibernate作為資料持久化工具(orm工具)來操作關系資料庫。如果我們使用的是apache tomcat、mysql資料庫和linux環境,這就是一個完整的使用開源軟體搭建企業應用的典型案例,對于應用開發來說,這樣的架構組合是非常有吸引力的,因為這個架構的使用基本上沒有什麼license的費用,而且利用其進行開發的人員衆多,已經成為java應用開發中的主流技術。在這個架構中,hibernate是一個獨立的orm資料持久化産品,目前是jboss/redhat産品組合的一員,是一款著名的java開源軟體産品,使用者衆多。比較spring jdbc和hibernae對資料庫操作的支援,對spring來說,其對資料持久化的支援,雖然也有jdbc的封裝,可以完成一些将簡單的資料記錄到java資料對象的轉換和映射工作,但和hibernate相比,功能上畢竟還是有一些單薄,比如hibernate還提供了各種資料的查詢、友善的對象和關系資料的映射等。是以,在大多數應用中,将hibernate和spring一起使用是非常普遍的,因為一方面hibernate提供了完整的和已經成為事實标準的orm功能,另一方面,spring也提供了與hibernated的內建和封裝,包括聲明式事務處理的封裝等。對于web ui層而言,盡管spring提供了自己的mvc實作,但與struts的流行程度相比,這個spring mvc的使用并不廣泛,畢竟在web開發領域,struts成名更早。在這個架構組合中,spring起到的是一個應用平台的作用,通過spring的內建,可以讓應用在直接部署在tomcat這個web伺服器上 ,因為作為一個直接依賴jvm的輕量級架構,spring的部署方式就是一個簡單的jar包,不需要以一個j2ee應用伺服器的形式出現,進而使整個應用在tomcat這樣的web伺服器上可以直接運作起來,非常簡潔。同樣地,如果我們在測試環境中使用spring,還可以選擇使用jetty來提供web服務,使用hsqldb這樣的由純java實作的資料庫。這樣的環境,不但可以為調試應用帶來許多便利,還可以進一步展現spring輕量級開發的特點。

同樣,因為spring的實作中,它的核心實作,比如ioc容器實作,是直接依賴jvm虛拟機的,也就是說,在java環境中,spring ioc容器是可以單獨使用的,特别是在beanfactory的基本實作中,包含在一個小小的jar包裡面,可以直接在應用中引用。對于spring而言,如果要在.net環境下使用其提供的基本特性,spring項目也提供了spring .net的實作;如果需要在android移動平台中使用spring的基本特性,spring也有對spring android項目的支援。從這些應用場景上可以看出,因為spring設計時的輕量級特性,以及推崇pojo開發,是以使用起來非常靈活。在對spring的應用中,spring團隊為我們列舉了spring的價值,非常值得參考。

spring是一個非侵入性(non-invasive)架構,其目标是使應用程式代碼對架構的依賴最小化,應用代碼可以在沒有spring或者其他容器的情況下運作。

spring提供了一個一緻的程式設計模型,使應用直接使用pojo開發,進而可以與運作環境(如應用伺服器)隔離開來。

spring推動應用的設計風格向面向對象及面向接口程式設計轉變,提高了代碼的重用性和可測試性。

spring改進了體系結構的選擇,雖然作為應用平台,spring可以幫助我們選擇不同的技術實作,比如從hiberante切換到其他orm工具,從struts切換到spring mvc,盡管我們通常不會這樣做,但是我們在技術方案上選擇使用spring作為應用平台,spring至少為我們提供了這種可能性和選擇,進而降低了平台鎖定的風險。