在這個Spring框架大行其道的軟件開發世界裏,尚有不少工程師每天在用,可是歷來不會去思考下,Spring框架的總體架構究竟是什麼樣子的啊。
1、首先經過維基百科看看什麼是Spring框架
維基百科的地址:Spring框架的維基百科html
2、看一下官網的介紹
Spring Framework 是一個開源的Java/Java EE全功能棧(full-stack)的應用程序框架,以Apache License 2.0開源許可協議的形式發佈,也有.NET平臺上的移植版本。該框架基於 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一書中的代碼,最初由Rod Johnson和Juergen Hoeller等開發。Spring Framework提供了一個簡易的開發方式,這種開發方式,將避免那些可能導致底層代碼變得繁雜混亂的大量的屬性文件和幫助類。react
Spring中包含的關鍵特性:
強大的基於JavaBeans的採用控制反轉(Inversion of Control,IoC)原則的配置管理,使得應用程序的組建更加快捷簡易。
一個可用於Java EE等運行環境的核心Bean工廠。
數據庫事務的通常化抽象層,容許聲明式(Declarative)事務管理器,簡化事務的劃分使之與底層無關。
內建的針對JTA和單個JDBC數據源的通常化策略,使Spring的事務支持不要求Java EE環境,這與通常的JTA或者EJB CMT相反。
JDBC 抽象層提供了有針對性的異常等級(再也不從SQL異常中提取原始代碼),簡化了錯誤處理,大大減小了程序員的編碼量。再次利用JDBC時,你無需再寫出另外一個’終止’(finally)模塊。而且面向JDBC的異常與Spring通用數據訪問對象(Data Access Object)異常等級相一致。
以資源容器,DAO實現和事務策略等形式與Hibernate,JDO和MyBatis、SQL Maps集成。利用衆多的翻轉控制方便特性來全面支持,解決了許多典型的Hibernate集成問題。全部這些所有聽從 Spring 通用事務處理和通用數據訪問對象異常等級規範。
靈活的基於核心 Spring 功能的MVC網頁應用程序框架。開發者經過策略接口將擁有對該框架的高度控制,於是該框架將適應於多種呈現(View)技術,例如JSP、FreeMarker、Velocity、Thymeleaf 等。值得注意的是,Spring 中間層能夠輕易地結合於任何基於MVC框架的網頁層,例如Struts、WebWork或Tapestry。
提供諸如事務管理等服務的AOP框架。
在設計應用程序 Model 時,MVC模式(例如Struts)一般難於給出一個簡潔明瞭的框架結構。Spring 卻具備可以讓這部分工做變得簡單的能力。程序開發員們可使用Spring的JDBC抽象層從新設計那些複雜的框架結構。程序員
瞭解一下Spring的版本歷史:
1.初版由 Rod Johnson 開發,並在2002年10月發佈在 Expert One-on-One J2EE Design and Development 一書中。2003年6月,Spring Framework 第一次發佈在 Apache 2.0 許可證下。2004年3月,發佈了里程碑的版本1.0,2004年9月以及2005年3月,又發佈了新的里程碑版本。2006年,Spring Framework 得到了 Jolt 生產力獎 和 JAX 創新獎。web
2.2006年10月發佈Spring 2.0,2007年11月 Spring 2.5,2009年12月 Spring 3.0,2011年 Spring 3.1,2013年11月 Spring 3.2.5,2013年12月發佈了4.0版本。[4]值得注意的是,Spring 4.0 版本中增長了對 Java SE 8, Groovy 2, Java EE7 的一些方面以及 WebSocket 的支持。spring
3.2017年9月 Spring Framework 正式發佈了 5.0 版本,此版本引入了 Spring WebFlux,一個高性能、響應式、異步的 Web 框架。Spring 5.0 重點增強了對函數式編程、響應式編程(reactive programming)的支持能力,是一個很是大的進步。數據庫
3、Spring的總體描述
Spring Framework 做爲一個優秀的開源框架,是爲了解決企業應用程序開發複雜性而建立的。框架的主要優點之一就是其分層架構,分層架構容許您選擇使用哪個組件,同時爲 J2EE 應用程序開發提供集成的框架。
如今的Spring已然發展成了一個平臺,引用Spring官網的原話:
From configuration to security, web apps to big data – whatever the infrastructure needs of your application may be, there is a Spring Project to help you build it. Start small and use just what you need – Spring is modular by design.編程
4、Spring有很是多的主要項目的支持
Spring主要的項目支持
下面例舉幾個比較經常使用的:
Main Projects:
Spring Framework
Spring Boot
Spring Cloud
Spring Security
Spring Data
……設計模式
5、Spring的總體架構(Spring Framework 3.x)
Spring Framework總共有十幾個組件,其中核心組件只有三個:Core、Context 和 Beans。
Spring Framework 3.x 的整體架構圖
數組
6、組件說明
組成 Spring Framework的每一個模塊(或組件)均可以單獨存在,或者與其餘一個或多個模塊聯合實現。每一個模塊的功能以下:
Spring Core(核心容器):核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。
Spring Context(上下文):Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如:JNDI、EJB、電子郵件、國際化、校驗和調度功能。
Spring AOP:經過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。因此,能夠很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。經過使用 Spring AOP,不用依賴 EJB 組件,就能夠將聲明性事務管理集成到應用程序中。
Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不一樣數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,而且極大地下降了須要編寫的異常代碼數量(例如打開和關閉鏈接)。Spring DAO 的面向 JDBC 的異常聽從通用的 DAO 異常層次結構。
Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。全部這些都聽從 Spring 的通用事務和 DAO 異常層次結構。
Spring Web 模塊:Web 上下文模塊創建在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。因此,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。
Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。經過策略接口,MVC 框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。瀏覽器
從圖中能夠看出,IOC(控制反轉) 的實現包 spring-beans 和 AOP(依賴注入) 的實現包 spring-aop 也是整個框架的基礎,而 spring-core 是整個框架的核心,基礎的功能都在這裏。
在此基礎之上,spring-context 提供上下文環境,爲各個模塊提供粘合做用。
在 spring-context 基礎之上提供了 spring-tx 和 spring-orm包,而web部分的功能,都是要依賴spring-web來實現的。
7、Spring Framework 4.x 的系統架構
8、Spring Framework 4.x 和Spring Framework 3.2.x的架構變化
1.從圖中能夠看出,整體的層次結構沒有太大變化,變化的是 Spring 4.0.3去掉了 struts 模塊(spring-struts包)。如今的 Spring mvc的確已經足夠優秀了,大量的 web 應用均已經使用了 Spring mvc。而 struts1.x 的架構太落後了,struts2.x 是 struts 自身提供了和 Spring 的集成包,可是因爲以前版本的 struts2 存在不少致命的安全漏洞,因此,大大影響了其使用度,好在最新的2.3.16版本的 struts 安全有所改善,但願不會再出什麼大亂子。
2.web 部分去掉了 struts 模塊,可是增長 WebSocket 模塊(spring-websocket包),增長了對 WebSocket、SockJS 以及 STOMP 的支持,它與 JSR-356 Java WebSocket API 兼容。另外,還提供了基於 SockJS(對 WebSocket 的模擬)的回調方案,以適應不支持 WebSocket 協議的瀏覽器。
3.同時,增長了 messaging 模塊(spring-messaging),提供了對 STOMP 的支持,以及用於路由和處理來自 WebSocket 客戶端的 STOMP 消息的註解編程模型。spring-messaging 模塊中還 包含了 Spring Integration 項目中的核心抽象類,如 Message、MessageChannel、MessageHandler。
4.若是去看源代碼的話,還能夠發現還有一個新增的包,增強了 beans 模塊,就是 spring-beans-groovy。應用能夠部分或徹底使用 Groovy 編寫。藉助於 Spring 4.0,可以使用 Groovy DSL 定義外部的 Bean 配置,這相似於 XML Bean 聲明,可是語法更爲簡潔。使用Groovy還可以在啓動代碼中直接嵌入Bean的聲明。
5.API的變更,能夠參考:變更報告
第三方類庫至少使用2010/2011年發佈的版本,尤爲是Hibernate 3.6+, EhCache 2.1+, Quartz 1.8+, Groovy 1.8+, and Joda-Time 2.0+。Hibernate Validator要求使用4.3+,Jackson 2.0+。
6.對JDK的支持:Java 8支持。固然也支持Java6和Java7,但最好在使用Spring框架3.X或4.X時,將JDK升級到Java7,由於有些版本至少須要Java7。
7.對JavaEE的支持:Java EE 6和7。使用Spring4.x時Java EE版本至少要6或以上,且須要JPA 2.0和Servlet 3.0 的支持,因此服務器,web容器須要作相應的升級。一個更具前瞻性的注意是,Spring4.0支持J2EE 7的適用級規範,好比JMS 2.0, JTA 1.2, JPA 2.1, Bean Validation 1.1和JSR-236併發工具包,在選擇這些jar包時須要注意版本。
使用Groovy DSL定義外部Bean。
8.核心容器提高:
8.1 支持Bean的泛型注入,好比:@Autowired Repository customerRepository
8.2 使用元註解開發暴露指定內部屬性的自定義註解。
8.3 經過 @Ordered註解或Ordered 接口對注入集合或數組的 Bean 進行排序。
8.4 @Lazy 註解能夠用在注入點或 @Bean 定義上。
8.5 爲開發者引入 @Description 註解。
8.6 引入 @Conditional 註解進行有條件的 Bea n過濾。
8.7 基於 CGLIB 的代理類不須要提供默認構造器,由於 Spring 框架將 CGLIB 整合到內部了。
8.8 框架支持時區管理,好比 LocalContext
9.Web提高
9.1 增長新的 @RestController 註解,這樣就不須要在每一個 @RequestMapping 方法中添加 @ResponseBody 註解。
9.2 添加 AsyncRestTemplate,在開發 REST 客戶端時容許非阻塞異步支持。
爲 Spring MVC 應用程序開發提供全面的時區支持。
10.WebSocket,SockJS 和 STOMP 消息。
11.測試提高
11.1 spring-test 模塊裏的幾乎全部註解都能被用作元註解去建立自定義註解,來減小跨測試集時的重複配置。
11.2 活躍的 bean 定義配置文件能夠編程方式解析。
11.3 spring-core 模塊裏引入一個新的 SocketUtils 類,用於掃描本地可以使用的 TCP 和 UDP 服務端口。通常用於測試須要 socket 的狀況,好比測試開啓內存 SMTP 服務,FTP 服務,Servlet 容器等。
11.4 因爲 Spring4.0 的緣由,org.springframework.mock.web 包如今基於 Servlet 3.0 API。
10、Spring 4.x的新特性:Spring 4.X新特性
11、Spring的設計理念
Spring 是面向 Bean 的編程(BOP, Bean Oriented Programming),Bean 在 Spring 中才是真正的主角。Bean 在 Spring 中做用就像 Object 對 OOP 的意義同樣,沒有對象的概念就像沒有面向對象編程,Spring 中沒有 Bean 也就沒有 Spring 存在的意義。Spring 提供了 IOC 容器經過配置文件或者註解的方式來管理對象之間的依賴關係。
控制反轉模式(也稱做依賴性介入)的基本概念是:不建立對象,可是描述建立它們的方式。在代碼中不直接與對象和服務鏈接,但在配置文件中描述哪個組件須要哪一項服務。容器 (在 Spring 框架中是 IOC 容器) 負責將這些聯繫在一塊兒。
在典型的 IOC 場景中,容器建立了全部對象,並設置必要的屬性將它們鏈接在一塊兒,決定什麼時間調用方法。
12、面向切面編程
面向切面編程,即 AOP(Aspect Oriented Programming),是一種編程技術,它容許程序員對橫切關注點或橫切典型的職責分界線的行爲(例如日誌和事務管理)進行模塊化。AOP 的核心構造是方面,它將那些影響多個類的行爲封裝到可重用的模塊中。
AOP 和 IOC 是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的複雜問題。在典型的面向對象開發方式中,可能要將日誌記錄語句放在全部方法和 Java 類中才能實現日誌功能。在 AOP 方式中,能夠反過來將日誌服務模塊化,並以聲明的方式將它們應用到須要日誌的組件上。固然,優點就是 Java 類不須要知道日誌服務的存在,也不須要考慮相關的代碼。因此,用 Spring AOP 編寫的應用程序代碼是鬆散耦合的。
AOP 的功能徹底集成到了 Spring 事務管理、日誌和其餘各類特性的上下文中。
十3、IOC 容器
Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與 JavaBean 組件一塊兒使用。這個包一般不是由用戶直接使用,而是由服務器將其用做其餘多數功能的底層中介。下一個最高級抽象是 BeanFactory 接口,它是工廠設計模式的實現,容許經過名稱建立和檢索對象。BeanFactory 也能夠管理對象之間的關係。
BeanFactory 支持兩個對象模型:
單例 模型提供了具備特定名稱的對象的共享實例,能夠在查詢時對其進行檢索。Singleton 是默認的也是最經常使用的對象模型。對於無狀態服務對象很理想。
原型 模型確保每次檢索都會建立單獨的對象。在每一個用戶都須要本身的對象時,原型模型最適合。
bean 工廠的概念是 Spring 做爲 IOC 容器的基礎。IOC 將處理事情的責任從應用程序代碼轉移到框架。
具體其中還有不少的細節問題須要詳細的討論。祝你們學習愉快!