Spring框架

2022-06-20 12:01:43

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框架和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物件呢,這是本文主要研究的內容?
  • 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處理請求的過程的原始碼解析。