![容器魔術](http://static.javashuo.com/static/loading.gif)
做者關於此主題早期文章html
Spring框架快速入門web
要談Spring的歷史,就要先談J2EE。J2EE應用程序的普遍實現是在1999年和2000年開始的,它的出現帶來了諸如事務管理之類的核心中間層概念的標準化,可是在實踐中並無得到絕對的成功,由於開發效率,開發難度和實際的性能都使人失望。spring
曾經使用過EJB開發J2EE應用的人,必定知道,在EJB開始的學習和應用很是的艱苦,不少東西都不能一會兒就很容易的理解。EJB要嚴格地實現各類不一樣類型的接口,相似的或者重複的代碼大量存在。而配置也是複雜和單調,一樣使用JNDI進行對象查找的代碼也是單調而枯燥。雖然有一些開發工做隨着xdoclet的出現,而有所緩解,可是學習EJB的高昂代價,和極低的開發效率,極高的資源消耗,都形成了EJB的使用困難。而Spring出現的初衷就是爲了解決相似的這些問題。數據庫
Spring的一個最大的目的就是使J2EE開發更加容易。同時,Spring之因此與Struts、Hibernate等單層框架不一樣,是由於Spring致力於提供一個以統一的、高效的方式構造整個應用,而且能夠將單層框架以最佳的組合揉和在一塊兒創建一個連貫的體系。能夠說Spring是一個提供了更完善開發環境的一個框架,能夠爲POJO(Plain Old Java Object)對象提供企業級的服務。express
Spring的造成,最初來自Rod Jahnson所著的一本頗有影響力的書籍《Expert One-on-One J2EE Design and Development》,就是在這本書中第一次出現了Spring的一些核心思想,該書出版於2002年。另一本書《Expert One-on-One J2EE Development without EJB》,更進一步闡述了在不使用EJB開發J2EE企業級應用的一些設計思想和具體的作法。有時間了能夠詳細的研讀一下。編程
Spring Framework是一個輕量級的解決方案,也是構建企業級應用程序的潛在一站式解決方案。可是,Spring 是模塊化的,開發者能夠在項目中只使用其中本身須要的部分,例如,能夠在任何 web 框架上使用控制反轉(IoC),也能夠只使用 Hibernate 集成代碼或 JDBC 抽象層。它支持聲明式事務管理、經過 RMI 或 web 服務實現遠程訪問,並可使用多種方式持久化數據。它提供了功能全面的 MVC 框架 ,也能夠透明地集成 AOP 到軟件中。設計模式
Spring Framework是一個Java平臺,爲開發Java應用程序提供全面的基礎架構支持。Spring處理基礎架構,所以您能夠專一於您的應用程序。緩存
Spring被設計爲非侵入式的,這意味着您的域邏輯代碼一般不依賴於框架自己。在集成層(例如數據訪問層)中,將存在對數據訪問技術和Spring庫的一些依賴性。可是,應該很容易將這些依賴項與其他代碼庫隔離開來。服務器
Spring容許您從「普通舊Java對象」(POJO)構建應用程序,並以非侵入方式將企業服務應用於POJO。此功能適用於Java SE編程模型以及完整和部分Java EE。架構
做爲應用程序開發人員,您能夠從Spring平臺中受益的示例以下:
Java應用程序 - 指從受限制的嵌入式應用程序到n層服務器端企業應用程序 - 一般由協做造成應用程序的對象組成。所以,應用程序中的對象彼此依賴。
儘管Java平臺提供了豐富的應用程序開發功能,但它缺少將基本構建塊組織成一個連貫總體的方法,將該任務留給架構師和開發人員。雖然您可使用諸如Factory,Abstract Factory,Builder,Decorator和Service Locator 之類的設計模式來構成應用程序的各類類和對象實例,但這些模式只是:給出名稱的最佳實踐,描述爲模式的做用,應用位置,解決的問題等等。模式是必須在應用程序中實現的正式最佳實踐。
Spring框架控制反轉(IoC)組件經過提供一種將不一樣組件組合成一個可使用的徹底工做的應用程序的形式化方法來解決這一問題。Spring Framework將形式化的設計模式編碼爲能夠集成到您本身的應用程序中的對象。國外已經有許多組織和機構以這種方式使用Spring Framework來設計健壯,可維護的應用程序。
背景
「 問題是,控制的哪些方面是[他們]反轉? 」Martin Fowler 在2004年在他的網站上提出了關於控制反轉(IoC)的 問題 .Fowler建議從新命名原則,使其更加不言自明,並提出依賴注入。
Spring Framework由19個模塊組成的功能組成。可分爲 Data Access/Integration、Web、AOP and Instrumentation、 Core Container以及Test 這5組,以下圖所示:等,以下圖所示
Spring Core Container 包含 spring-core, spring-beans, spring-context, spring-context-support, 以及 spring-expression (Spring Expression Language,Spring 表達式語言,SpEL)模塊。
它們之間的完整依賴關係
其中,core 和 beans 模塊提供了 Spring 框架的基礎功能,包括控制反轉(IoC)和依賴注入。BeanFactory 是工廠模式的一種複雜而精緻的實現,它使開發者再也不須要使用編碼式單例(programmatic singletons),並可將配置和依賴從實際編碼邏輯中解耦。
context 模塊使得由 Core 和 Beans 提供的基礎功能真正構建成堅實的基礎:這意味着Spring 工程能以框架模式訪問對象,相似於JNDI註冊表。Context 模塊繼承了Beans 模塊的特性並增長了對國際化(例如資源綁定)、事件傳播、資源加載和context 透明化(例如 Servlet container)。同時,也支持JAVA EE 特性,例如 EJB、 JMX 和 基本的遠程訪問。Context 模塊的關鍵是 ApplicationContext 接口。
下圖是Spring工做原理的高級視圖。您的應用程序類與配置元數據相結合,以便在ApplicationContext
建立和初始化以後,您擁有徹底配置且可執行的系統或應用程序。
數據訪問與集成層包含 JDBC、ORM、OXM、JMS和TX模塊。
它們之間的完整依賴關係
數據訪問與集成層包含 JDBC、ORM、OXM、JMS和事務模塊。
spring-jdbc 模塊提供了 JDBC抽象層,它消除了冗長的 JDBC 編碼和對數據庫供應商特定錯誤代碼的解析。
spring-tx 模塊支持編程式事務和聲明式事務,可用於實現了特定接口的類和全部的 POJO 對象。編程式事務須要本身寫beginTransaction()、commit()、rollback()等事務管理方法,聲明式事務是經過註解或配置由 spring 自動處理,編程式事務粒度更細。
spring-orm 模塊提供了對流行的對象關係映射 API的集成,包括 JPA、JDO 和 Hibernate 等。經過此模塊可讓這些 ORM 框架和 spring 的其它功能整。
spring-oxm 模塊提供了對 OXM 實現的支持,好比JAXB、XML Beans等。
spring-jms 模塊包含生產(produce)和消費(consume)消息的功能
aop 模塊提供了面向切面編程(AOP)的實現,能夠定義諸如方法攔截器和切入點等,從而使實現功能的代碼完全的解耦。aspects 模塊提供了對 AspectJ 的集成。
instrument 模塊提供了對檢測類的支持和用於特定的應用服務器的類加載器的實現。
Web 層包括 spring-web、spring-webmvc、spring-webmvc-portlet 等模塊。
它們之間的完整依賴關係
spring-web 模塊提供面向 web 的基本功能和麪向 web 的應用上下文,好比 multipart 文件上傳功能、使用 Servlet 監聽器初始化 IoC 容器等。它還包括 HTTP 客戶端以及 Spring 遠程調用中與 web 相關的部分。
spring-webmvc 模塊(即 Web-Servlet 模塊)爲 web 應用提供了模型視圖控制(MVC)和 REST Web 服務的實現。Spring 的 MVC 框架可使領域模型代碼和 web 表單徹底地分離,且能夠與 Spring 框架的其它全部功能進行集成。
spring-webmvc-portlet 模塊(即Web-Portlet模塊)提供了用於 Portlet 環境的 MVC 實現,並反映了 pring-webmvc 模塊的功能。
模塊經過 JUnit 和 TestNG 組件支持單元測試和集成測試。它提供了一致性地加載和緩存 Spring 上下文,也提供了用於單獨測試代碼的模擬對象(mock object)。