##Spring起源## Rod Johson在2002年編著的《Expert one to one J2EE design and development》一書中,對Java EE正統框架臃腫、低效、脫離現實的種種現狀提出了質疑,並積極尋求探索革新之道。以此書爲指導思想,他編寫了interface21框架,這是一個力圖衝破Java EE傳統開發的困境,從實際需求出發,着眼於輕便、靈巧,易於開發、測試和部署的輕量級開發框架。web
Spring框架即以interface21框架爲基礎,通過從新設計,並不斷豐富其內涵,於2004年3月24日,發佈了1.0正式版。數據庫
同年他又推出了一部堪稱經典的力做《Expert one-to-one J2EE Development without EJB》,該書在Java世界掀起了軒然大波,不斷改變着Java開發者程序設計和開發的思考方式。在該書中,做者根據本身多年豐富的實踐經驗,對EJB的各類笨重臃腫的結構進行了逐一的分析和否認,並分別以簡潔實用的方式替換之。至此一戰功成,Rod Johnson成爲一個改變Java世界的大師級人物。編程
##Spring目標## 傳統J2EE應用的開發效率低,應用服務器廠商對各類技術的支持並無真正統一,致使J2EE的應用沒有真正實現Write Once及Run Anywhere的承諾。Spring做爲開源的中間件,獨立於各類應用服務器,甚至無須應用服務器的支持,也能提供應用服務器的功能,如聲明式事務等。設計模式
傳統的Java Web應用程序是採用JSP+Servlet+Javabean來實現的,這種模式實現了最基本的MVC分層,使的程序結構分爲幾層,有負責前臺展現的 JSP、負責流程邏輯控制的Servlet以及負責數據封裝的Javabean。可是這種結構仍然存在問題:如JSP頁面中須要使用符號嵌入不少的 Java代碼,形成頁面結構混亂,Servlet和Javabean負責了大量的跳轉和運算工做,耦合緊密,程序複用度低等等。安全
Spring的目標就是徹底解耦類之間的依賴關係,一個類若是要依賴什麼,那就是一個接口。至於如何實現這個接口,這都不重要了。只要拿到一個實現了這個接口的類,就能夠輕鬆的經過xml配置文件把實現類注射到調用接口的那個類裏。全部類之間的這種依賴關係就徹底經過配置文件的方式替代了。因此Spring框架最核心的就是所謂的依賴注入和控制反轉。服務器
Spring致力於J2EE應用的各層的解決方案,而不是僅僅專一於某一層的方案。能夠說Spring是企業應用開發的「一站式」選擇,並貫穿表現層、業務層及持久層。然而,Spring並不想取代那些已有的框架,而與它們無縫地整合。 ##Spring簡介## Spring是一個開源框架,它是爲了解決企業應用開發的複雜性而建立的。框架的主要優點之一就是其分層架構,分層架構容許您選擇使用哪個組件,同時爲J2EE應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成之前只可能由EJB完成的事情。然而,Spring的用途不只限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用均可以從Spring中受益。架構
分層架構: app
- Presentation layer(表示層):(1)表示邏輯(生成界面代碼);(2)接收請求;(3)處理業務層拋出的異常;(4)負責規則驗證(數據格式,數據非空等);(5)流程控制;
- Service layer(服務層/業務層):(1)封裝業務邏輯處理,而且對外暴露接口;(2)負責事務,安全等服務以及數據訪問邏輯;
- Persistence layer(持久層):(1)提供透明的數據訪問和接口;(2)封裝數據訪問的邏輯,暴露接口;(3)提供方便的數據訪問的方案(查詢語言,API,映射機制等);
- Domain layer(域層):(1)域層就是一堆實體的集合,包括實體的關係;(2)業務對象以及業務關係的表示;(3)處理簡單的業務邏輯;(4)域層的對象能夠穿越表示層,業務層,持久層;
簡單來講,Spring是一個輕量級的控制反轉(IOC)和麪向切面(AOP)的容器框架。框架
- 輕量—從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架能夠在一個大小隻有1MB多的JAR文件裏發佈。而且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型的,Spring應用中的對象不依賴於Spring的特定類。
- 控制反轉—Spring經過一種稱做控制反轉(IOC)的技術促進了鬆耦合。當應用了IOC,一個對象依賴的其它對象會經過被動的方式傳遞進來,而不是這個對象本身建立或者查找依賴對象。你能夠認爲IOC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
- 面向切面—Spring提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務(例如事務管理)進行內聚性的開發。應用對象只實現它們應該作的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。
- 容器—Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你能夠配置你的每一個bean如何被建立—基於一個可配置原型(prototype),你的bean能夠建立一個單獨的實例或者每次須要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不該該被混同於傳統的重量級的EJB容器,它們常常是龐大與笨重的,難以使用。
- 框架—Spring能夠將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。Spring也提供了不少基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。
全部Spring的這些特徵使你可以編寫更乾淨、更可管理、而且更易於測試的代碼。它們也爲Spring中的各類模塊提供了基礎支持。 ##爲何須要Spring## 你可能正在想「Spring不過是另一個的framework」。當已經有許多開放源代碼(和專有) J2EE framework時,咱們爲何還須要Spring Framework?模塊化
J2EE開發存在的問題:
- EJB 軟件難編寫,難測試;
- EntityBean 做爲持久化方案,性能比較低下,O/R Mapping 支持不夠,不能脫離容器;
- 設計困難;
- 侵入式方案,EJB 要使用特定的接口;
Spring是獨特的,由於若干個緣由:
- 它定位的領域是許多其餘流行的framework沒有的。Spring關注提供一種方法管理你的業務對象。
- Spring是全面的和模塊化的。Spring有分層的體系結構,這意味着你能選擇使用它孤立的任何部分,它的架構仍然是內在穩定的。所以從你的學習中,你可獲得最大的價值。例如,你可能選擇僅僅使用Spring來簡單化JDBC的使用,或用來管理全部的業務對象。
- 它的設計從底部幫助你編寫易於測試的代碼。Spring是用於測試驅動工程的理想的framework。
- Spring對你的工程來講,是潛在地一站式解決方案,定位於與典型應用相關的大部分基礎結構。
##Spring帶給咱們什麼##
- 方便解耦,簡化開發:經過Spring提供的IOC容器,咱們能夠將對象之間的依賴關係交由Spring進行控制,避免硬編碼所形成的過分程序耦合。有了Spring,用戶沒必要再爲單實例模式類、屬性文件解析等這些很底層的需求編寫代碼,能夠更專一於上層的應用。
- AOP編程的支持:經過Spring提供的AOP功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能能夠經過AOP輕鬆應付。
- 聲明式事務的支持:在Spring中,咱們能夠從單調煩悶的事務管理代碼中解脫出來,經過聲明式方式靈活地進行事務的管理,提升開發效率和質量。
- 方便程序的測試:能夠用非容器依賴的編程方式進行幾乎全部的測試工做,在Spring裏,測試再也不是昂貴的操做,而是隨手可作的事情。
- 方便集成各類優秀框架:Spring不排斥各類優秀的開源框架,相反,Spring能夠下降各類框架的使用難度,Spring提供了對各類優秀框架(如Struts、Hibernate、Hession、Quartz)等的直接支持。
- 下降Java EE API的使用難度:Spring對不少難用的Java EE API(如JDBC,JavaMail,遠程調用等)提供了一個薄薄的封裝層,經過Spring的簡易封裝,這些Java EE API的使用難度大爲下降。
- Java 源碼是經典學習範例:Spring的源碼設計精妙、結構清晰、匠心獨用,到處體現着大師對Java設計模式靈活運用以及對Java技術的高深造詣。Spring框架源碼無疑是Java技術的最佳實踐範例。若是想在短期內迅速提升本身的Java技術水平和應用開發水平,學習和研究Spring源碼將會使你收到意想不到的效果。
##Spring好處## 在咱們進入細節之前,讓咱們看一下Spring能夠給一個工程帶來的一些好處:
- Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。若是你僅僅使用了Struts或其餘的包含了J2EE特有APIs的framework,你會發現Spring關注了遺留下的問題。
- Spring能消除在許多工程上對Singleton的過多使用。根據個人經驗,這是一個主要的問題,它減小了系統的可測試性和麪向對象特性。
- Spring能消除使用各類各樣格式的屬性定製文件的須要,在整個應用和工程中,可經過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統屬性,爲此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。
- Spring能經過接口而不是類促進好的編程習慣,減小編程代價到幾乎爲零。
- Spring被設計爲讓使用它建立的應用盡量少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。
- 使用Spring構建的應用程序易於單元測試。
- Spring能使EJB的使用成爲一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。
- Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web應用。例如,Spring能使用AOP提供聲明性事務而不經過使用EJB容器,若是你僅僅須要與單個的數據庫打交道,甚至不須要JTA實現。
- Spring爲數據存取提供了一致的框架,不管是使用JDBC或O/R mapping產品(如Hibernate)。
Spring確實使你能經過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。總結起來,Spring有以下優勢:
- 低侵入式設計,代碼污染極低。
- 獨立於各類應用服務器,能夠真正實現Write Once,Run Anywhere的承諾。
- Spring的DI機制下降了業務對象替換的複雜性。
- Spring並不徹底依賴於Spring,開發者可自由選用Spring框架的部分或所有。
你會發現,遵循Spring框架的應用程序,必定是設計良好的,針對接口編程,這樣就簡化了企業級程序的設計。Spring 提供輕量級的容器,使得咱們的程序再也不依賴於重量級的容器(好比EJB容器),而且開發的程序不依賴於SpringAPI,能夠方便的切換到其它框架。
##Spring能作什麼## Spring的核心是輕量級(Lightweight)的容器(Container),它實現了IoC容器、非侵入性(No intrusive)的框架,並提供AOP概念的實現方式,提供對持久層(Persistence)、事務(Transaction)的支持,提供MVC Web框架的實現,並對一些經常使用的企業服務API(Application Interface)提供一致的模型封裝,是一個全方位的應用程序框架(Application framework),另外,Spring也提供了對現有框架(Struts、JSF、Hibernate等)的整合方案。
首先,讓咱們明確Spring範圍。儘管Spring覆蓋了許多方面,但咱們已經有清楚的概念,它什麼應該涉及和什麼不該該涉及。Spring的主要目的是使J2EE易用和促進好編程習慣。
Spring不從新開發已有的東西。所以,在Spring中你將發現沒有日誌記錄的包,沒有鏈接池,沒有分佈事務調度。這些均有開源項目提供 (例如 Commons Logging 用來作全部的日誌輸出,或 Commons DBCP用來做數據鏈接池),或由你的應用程序服務器提供。由於一樣的的緣由,咱們沒有提供O/R mapping層,對此,已有有好的解決辦法如Hibernate和MyBatis。
Spring的目標是使已存在的技術更加易用。例如,儘管咱們沒有底層事務協調處理,但咱們提供了一個抽象層覆蓋了JTA或任何其餘的事務策略。
Spring沒有直接和其餘的開源項目競爭,除非咱們感到咱們能提供新的一些東西。例如,象許多開發人員,咱們歷來沒有爲Struts高興過,而且感到在MVC web framework中還有改進的餘地。在某些領域,例如輕量級的IOC容器和AOP框架,Spring有直接的競爭,可是在這些領域尚未已經較爲流行的解決方案。(Spring在這些區域是開路先鋒。)
Spring也得益於內在的一致性。全部的開發者都在唱一樣的的讚歌,基礎想法依然是Expert One-on-One J2EE設計與開發的那些。而且咱們已經可以使用一些主要的概念,例如倒置控制,來處理多個領域。Spring在應用服務器之間是可移植的。固然保證可移植性老是一次挑戰,可是咱們避免任何特定平臺或非標準化,而且支持在 WebLogic,Tomcat,Resin,JBoss,WebSphere和其餘的應用服務器上的用戶。
下一節:【第1章 Spring概述與結構】1.2 Spring模塊與結構