Spring框架 - Spring和Spring框架組成
Spring是什麼?它是怎麼誕生的?有哪些主要的元件和核心功能呢? 本文通過這幾個問題幫助你構築Spring和Spring Framework的整體認知。@pdai
什麼是Spring?
首先,Spring是什麼?它是怎麼誕生的?它的誕生是為了解決什麼問題?@pdai
Spring的起源
百度百科中關於Spring的起源介紹如下:
要談Spring的歷史,就要先談J2EE。J2EE應用程式的廣泛實現是在1999年和2000年開始的,它的出現帶來了諸如事務管理之類的核心中間層概念的標準化,但是在實踐中並沒有獲得絕對的成功,因為開發效率,開發難度和實際的效能都令人失望。
曾經使用過EJB開發JAVA EE應用的人,一定知道,在EJB開始的學習和應用非常的艱苦,很多東西都不能一下子就很容易的理解。EJB要嚴格地實現各種不同型別的介面,類似的或者重複的程式碼大量存在。而配置也是複雜和單調,同樣使用JNDI進行物件查詢的程式碼也是單調而枯燥。雖然有一些開發工作隨著xdoclet的出現,而有所緩解,但是學習EJB的高昂代價,和極低的開發效率,極高的資源消耗,都造成了EJB的使用困難。而Spring出現的初衷就是為了解決類似的這些問題。
Spring的一個最大的目的就是使JAVA EE開發更加容易。同時,Spring之所以與Struts、Hibernate等單層框架不同,是因為Spring致力於提供一個以統一的、高效的方式構造整個應用,並且可以將單層框架以最佳的組合揉和在一起建立一個連貫的體系。可以說Spring是一個提供了更完善開發環境的一個框架,可以為POJO(Plain Ordinary Java Object)物件提供企業級的服務。
Spring的形成,最初來自Rod Jahnson所著的一本很有影響力的書籍《Expert One-on-One J2EE Design and Development》,就是在這本書中第一次出現了Spring的一些核心思想,該書出版於2002年。
Spring的特性和優勢
Spring Framework有哪些特性,用了這個框架對開發而言有什麼好處呢?
從Spring 框架的特性來看:
- 非侵入式:基於Spring開發的應用中的物件可以不依賴於Spring的API
- 控制反轉:IOC——Inversion of Control,指的是將物件的建立權交給 Spring 去建立。使用 Spring 之前,物件的建立都是由我們自己在程式碼中new建立。而使用 Spring 之後。物件的建立都是給了 Spring 框架。
- 依賴注入:DI——Dependency Injection,是指依賴的物件不需要手動呼叫 setXX 方法去設定,而是通過配置賦值。
- 面向切面程式設計:Aspect Oriented Programming——AOP
- 容器:Spring 是一個容器,因為它包含並且管理應用物件的生命週期
- 元件化:Spring 實現了使用簡單的元件配置組合成一個複雜的應用。在 Spring 中可以使用XML和Java註解組合這些物件。
- 一站式:在 IOC 和 AOP 的基礎上可以整合各種企業應用的開源框架和優秀的第三方類庫(實際上 Spring 自身也提供了表現層的 SpringMVC 和持久層的 Spring JDBC)
從使用Spring 框架的好處看:
- Spring 可以使開發人員使用 POJOs 開發企業級的應用程式。只使用 POJOs 的好處是你不需要一個 EJB 容器產品,比如一個應用程式伺服器,但是你可以選擇使用一個健壯的 servlet 容器,比如 Tomcat 或者一些商業產品。
- Spring 在一個單元模式中是有組織的。即使包和類的數量非常大,你只要擔心你需要的,而其它的就可以忽略了。
- Spring 不會讓你白費力氣做重複工作,它真正的利用了一些現有的技術,像 ORM 框架、日誌框架、JEE、Quartz 和 JDK 計時器,其他檢視技術。
- 測試一個用 Spring 編寫的應用程式很容易,因為環境相關的程式碼被移動到這個框架中。此外,通過使用 JavaBean-style POJOs,它在使用依賴注入注入測試資料時變得更容易。
- Spring 的 web 框架是一個設計良好的 web MVC 框架,它為比如 Structs 或者其他工程上的或者不怎麼受歡迎的 web 框架提供了一個很好的供替代的選擇。MVC 模式導致應用程式的不同方面(輸入邏輯,業務邏輯和UI邏輯)分離,同時提供這些元素之間的鬆散耦合。模型(Model)封裝了應用程式資料,通常它們將由 POJO 類組成。檢視(View)負責渲染模型資料,一般來說它生成客戶端瀏覽器可以解釋 HTML 輸出。控制器(Controller)負責處理使用者請求並構建適當的模型,並將其傳遞給檢視進行渲染。
- Spring 對 JavaEE 開發中非常難用的一些 API(JDBC、JavaMail、遠端呼叫等),都提供了封裝,使這些API應用難度大大降低。
- 輕量級的 IOC 容器往往是輕量級的,例如,特別是當與 EJB 容器相比的時候。這有利於在記憶體和 CPU 資源有限的計算機上開發和部署應用程式。
- Spring 提供了一致的事務管理介面,可向下擴充套件到(使用一個單一的資料庫,例如)本地事務並擴充套件到全域性事務(例如,使用 JTA)
Spring有哪些元件?
Spring Framework有哪些元件呢?
下圖來自,官方文件 Spring-framework 5.0;需要注意的是,雖然這個圖來源於Spring Framwork5.0 M4 版本,但是它依然是V4版本的圖,比如Spring 5版本中的web模組已經去掉了Portlet模組,新增了WebFlux模組等。
上圖中包含了 Spring 框架的所有模組,這些模組可以滿足一切企業級應用開發的需求,在開發過程中可以根據需求有選擇性地使用所需要的模組。下面分別對這些模組的作用進行簡單介紹(並且結合SpringFramework5.x原始碼模組幫助你對應好各模組關係)。
Core Container(Spring的核心容器)
Spring 的核心容器是其他模組建立的基礎,由 Beans 模組、Core 核心模組、Context 上下文模組和 SpEL 表示式語言模組組成,沒有這些核心容器,也不可能有 AOP、Web 等上層的功能。具體介紹如下。
- Beans 模組:提供了框架的基礎部分,包括控制反轉和依賴注入。
- Core 核心模組:封裝了 Spring 框架的底層部分,包括資源訪問、型別轉換及一些常用工具類。
- Context 上下文模組:建立在 Core 和 Beans 模組的基礎之上,整合 Beans 模組功能並新增資源繫結、資料驗證、國際化、Java EE 支援、容器生命週期、事件傳播等。ApplicationContext 介面是上下文模組的焦點。
- SpEL 模組:提供了強大的表示式語言支援,支援訪問和修改屬性值,方法呼叫,支援訪問及修改陣列、容器和索引器,命名變數,支援算數和邏輯運算,支援從 Spring 容器獲取 Bean,它也支援列表投影、選擇和一般的列表聚合等。
對應的原始碼模組如下:
Data Access/Integration(資料訪問/整合)
資料訪問/整合層包括 JDBC、ORM、OXM、JMS 和 Transactions 模組,具體介紹如下。
- JDBC 模組:提供了一個 JBDC 的樣例模板,使用這些模板能消除傳統冗長的 JDBC 編碼還有必須的事務控制,而且能享受到 Spring 管理事務的好處。
- ORM 模組:提供與流行的“物件-關係”對映框架無縫整合的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且還可以使用 Spring 事務管理,無需額外控制事務。
- OXM 模組:提供了一個支援 Object /XML 對映的抽象層實現,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。將 Java 物件對映成 XML 資料,或者將XML 資料對映成 Java 物件。
- JMS 模組:指 Java 訊息服務,提供一套 “訊息生產者、訊息消費者”模板用於更加簡單的使用 JMS,JMS 用於用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。
- Transactions 事務模組:支援程式設計和宣告式事務管理。
對應的原始碼模組如下:
Web模組
Spring 的 Web 層包括 Web、Servlet、WebSocket 和 Webflux 元件,具體介紹如下。
- Web 模組:提供了基本的 Web 開發整合特性,例如多檔案上傳功能、使用的 Servlet 監聽器的 IOC 容器初始化以及 Web 應用上下文。
- Servlet 模組:提供了一個 Spring MVC Web 框架實現。Spring MVC 框架提供了基於註解的請求資源注入、更簡單的資料繫結、資料驗證等及一套非常易用的 JSP 標籤,完全無縫與 Spring 其他技術協作。
- WebSocket 模組:提供了簡單的介面,使用者只要實現響應的介面就可以快速的搭建 WebSocket Server,從而實現雙向通訊。
- Webflux 模組: Spring WebFlux 是 Spring Framework 5.x中引入的新的響應式web框架。與Spring MVC不同,它不需要Servlet API,是完全非同步且非阻塞的,並且通過Reactor專案實現了Reactive Streams規範。Spring WebFlux 用於建立基於事件迴圈執行模型的完全非同步且非阻塞的應用程式。
此外Spring4.x中還有Portlet 模組,在Spring 5.x中已經移除
- Portlet 模組:提供了在 Portlet 環境中使用 MVC 實現,類似 Web-Servlet 模組的功能。
對應的原始碼模組如下:
AOP、Aspects、Instrumentation和Messaging
在 Core Container 之上是 AOP、Aspects 等模組,具體介紹如下:
- AOP 模組:提供了面向切面程式設計實現,提供比如日誌記錄、許可權控制、效能統計等通用功能和業務邏輯分離的技術,並且能動態的把這些功能新增到需要的程式碼中,這樣各司其職,降低業務邏輯和通用功能的耦合。
- Aspects 模組:提供與 AspectJ 的整合,是一個功能強大且成熟的面向切面程式設計(AOP)框架。
- Instrumentation 模組:提供了類工具的支援和類載入器的實現,可以在特定的應用伺服器中使用。
- messaging 模組:Spring 4.0 以後新增了訊息(Spring-messaging)模組,該模組提供了對訊息傳遞體系結構和協議的支援。
- jcl 模組: Spring 5.x中新增了日誌框架整合的模組。
對應的原始碼模組如下:
Test模組
Test 模組:Spring 支援 Junit 和 TestNG 測試框架,而且還額外提供了一些基於 Spring 的測試功能,比如在測試 Web 框架時,模擬 Http 請求的功能。
包含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。
對應的原始碼模組如下:
為什麼用Spring?
那麼為什麼用Spring呢?來看看官網對這個問題的回答
最重要的體現在它能做什麼,這是Spring的核心所在
且官方對此專門對此做了詳細介紹,感興趣可以看下
學習Spring時參考哪些資料呢?
非常負責任的告訴你,最好最全的資料在Spring的官網,Spring能成為最主要的企業開發框架,文件和生態體系也做的很好;這裡介紹下如何獲取官方的學習資源。@pdai
Spring 的官方專案和教程
官方的專案和教程,地址在這裡,在學習Spring時,一定要把它當做生態體系,而是不是一個簡單的開發框架。
Spring 的歸檔文件
官方提供了系統性的文件的FTP,你可以在這裡找到所有歷史版本的PDF/HTML版本。
可以看到很多系統性的文件,包括上面引用的圖,
Spring 的官方Github
Spring官方的GitHub在這裡,它包含著Spring-framework的原始碼,如果你感興趣,可以從這裡clone程式碼進行閱讀。
更多文章
首先, 從Spring框架的整體架構和組成對整體框架有個認知。
- Spring基礎 - Spring和Spring框架組成
- Spring是什麼?它是怎麼誕生的?有哪些主要的元件和核心功能呢? 本文通過這幾個問題幫助你構築Spring和Spring Framework的整體認知。
其次,通過案例引出Spring的核心(IoC和AOP),同時對IoC和AOP進行案例使用分析。
- Spring基礎 - Spring簡單例子引入Spring的核心
- 上文中我們簡單介紹了Spring和Spring Framework的元件,那麼這些Spring Framework元件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework元件的典型應用場景和基於這個場景設計出的簡單案例,並以此引出Spring的核心要點,比如IOC和AOP等;在此基礎上還引入了不同的配置方式, 如XML,Java配置和註解方式的差異。
- Spring基礎 - Spring核心之控制反轉(IOC)
- 在Spring基礎 - Spring簡單例子引入Spring的核心中向你展示了IoC的基礎含義,同時以此發散了一些IoC相關知識點; 本節將在此基礎上進一步解讀IOC的含義以及IOC的使用方式
- Spring基礎 - Spring核心之面向切面程式設計(AOP)
- 在Spring基礎 - Spring簡單例子引入Spring的核心中向你展示了AOP的基礎含義,同時以此發散了一些AOP相關知識點; 本節將在此基礎上進一步解讀AOP的含義以及AOP的使用方式。
基於Spring框架和IOC,AOP的基礎,為構建上層web應用,需要進一步學習SpringMVC。
- Spring基礎 - SpringMVC請求流程和案例
- 前文我們介紹了Spring框架和Spring框架中最為重要的兩個技術點(IOC和AOP),那我們如何更好的構建上層的應用呢(比如web 應用),這便是SpringMVC;Spring MVC是Spring在Spring Container Core和AOP等技術基礎上,遵循上述Web MVC的規範推出的web開發框架,目的是為了簡化Java棧的web開發。 本文主要介紹SpringMVC的請求流程和基礎案例的編寫和執行。
Spring進階 - IoC,AOP以及SpringMVC的原始碼分析
- Spring進階 - Spring IOC實現原理詳解之IOC體系結構設計
- 在對IoC有了初步的認知後,我們開始對IOC的實現原理進行深入理解。本文將幫助你站在設計者的角度去看IOC最頂層的結構設計
- Spring進階 - Spring IOC實現原理詳解之IOC初始化流程
- 上文,我們看了IOC設計要點和設計結構;緊接著這篇,我們可以看下原始碼的實現了:Spring如何實現將資源配置(以xml配置為例)通過載入,解析,生成BeanDefination並註冊到IoC容器中的
- Spring進階 - Spring IOC實現原理詳解之Bean例項化(生命週期,迴圈依賴等)
- 上文,我們看了IOC設計要點和設計結構;以及Spring如何實現將資源配置(以xml配置為例)通過載入,解析,生成BeanDefination並註冊到IoC容器中的;容器中存放的是Bean的定義即BeanDefinition放到beanDefinitionMap中,本質上是一個
ConcurrentHashMap<String, Object>
;並且BeanDefinition介面中包含了這個類的Class資訊以及是否是單例等。那麼如何從BeanDefinition中例項化Bean物件呢,這是本文主要研究的內容?
- 上文,我們看了IOC設計要點和設計結構;以及Spring如何實現將資源配置(以xml配置為例)通過載入,解析,生成BeanDefination並註冊到IoC容器中的;容器中存放的是Bean的定義即BeanDefinition放到beanDefinitionMap中,本質上是一個
- Spring進階 - Spring AOP實現原理詳解之切面實現
- 前文,我們分析了Spring IOC的初始化過程和Bean的生命週期等,而Spring AOP也是基於IOC的Bean載入來實現的。本文主要介紹Spring AOP原理解析的切面實現過程(將切面類的所有切面方法根據使用的註解生成對應Advice,並將Advice連同切入點匹配器和切面類等資訊一併封裝到Advisor,為後續交給代理增強實現做準備的過程)。
- Spring進階 - Spring AOP實現原理詳解之AOP代理
- 上文我們介紹了Spring AOP原理解析的切面實現過程(將切面類的所有切面方法根據使用的註解生成對應Advice,並將Advice連同切入點匹配器和切面類等資訊一併封裝到Advisor)。本文在此基礎上繼續介紹,代理(cglib代理和JDK代理)的實現過程。
- Spring進階 - Spring AOP實現原理詳解之Cglib代理實現
- 我們在前文中已經介紹了SpringAOP的切面實現和建立動態代理的過程,那麼動態代理是如何工作的呢?本文主要介紹Cglib動態代理的案例和SpringAOP實現的原理。
- Spring進階 - Spring AOP實現原理詳解之JDK代理實現
- 上文我們學習了SpringAOP Cglib動態代理的實現,本文主要是SpringAOP JDK動態代理的案例和實現部分。
- Spring進階 - SpringMVC實現原理之DispatcherServlet初始化的過程
- 前文我們有了IOC的原始碼基礎以及SpringMVC的基礎,我們便可以進一步深入理解SpringMVC主要實現原理,包含DispatcherServlet的初始化過程和DispatcherServlet處理請求的過程的原始碼解析。本文是第一篇:DispatcherServlet的初始化過程的原始碼解析。
- Spring進階 - SpringMVC實現原理之DispatcherServlet處理請求的過程
- 前文我們有了IOC的原始碼基礎以及SpringMVC的基礎,我們便可以進一步深入理解SpringMVC主要實現原理,包含DispatcherServlet的初始化過程和DispatcherServlet處理請求的過程的原始碼解析。本文是第二篇:DispatcherServlet處理請求的過程的原始碼解析。