spring原始碼分析第二天------spring系統概述以及IOC實現原理

jack#-#發表於2020-12-12

1、Spring5 概述

Spring 是一個開源的輕量級 Java SE(Java 標準版本)/Java EE(Java 企業版本)開發應用框架, 其目的是用於簡化企業級應用程式開發。
Spring 框架除了幫我們管理物件及其依賴關係,還提供像通用日誌記錄、效能統計、安全控制、異常 處理等面向切面的能力,還能幫我管理最頭疼的資料庫事務,本身提供了一套簡單的 JDBC 訪問實現, 提供與第三方資料訪問框架整合(如 Hibernate、JPA),與各種 Java EE 技術整合(如 Java Mail、 任務排程等等),提供一套自己的 web 層框架 Spring MVC、而且還能非常簡單的與第三方 Web 框架集 成。

1.1、Spring 設計的初衷

Spring 是為解決企業級應用開發的複雜性而設計,一個最根本的使命:簡化開發。
而 Spring 則立志於全方面的簡化 Java 開發。對此,她主要採取了 4 個關鍵策略:
1,基於 POJO 的輕量級和最小侵入性程式設計;
2,通過依賴注入和麵向介面鬆耦合;
3,基於切面和慣性進行宣告式程式設計;
4,通過切面和模板減少樣板式程式碼;
而他主要是通過:面向 Bean、依賴注入以及面向切面這三種方式來達成的。

1.2、IOC與IOC

Spring 提供了 IOC 容器通過配置檔案或者註解的方式來管理物件之間的依賴關係。
Spring 設計的核心 org.springframework.beans 包(架構核心是 org.springframework.core 包),這個包通常不是由使用者直接使用,而是由伺服器將 其用作其他多數功能的底層中介。下一個最高階抽象是 BeanFactory 介面,它是工廠設計模式的實現, 允許通過名稱建立和檢索物件。BeanFactory 也可以管理物件之間的關係。

BeanFactory 支援兩個物件模型。

1,單例:模型提供了具有特定名稱的物件的共享例項,可以在查詢時對其進行檢索。Singleton 是 預設的也是最常用的物件模型。對於無狀態服務物件很理想。
2,原型:模型確保每次檢索都會建立單獨的物件。在每個使用者都需要自己的物件時,原型模型最適 合

1.3、AOP 程式設計理念

面向切面程式設計,即 AOP,是一種程式設計思想,它允許程式設計師對橫切關注點或橫切典型的職責分界線的 行為(例如日誌和事務管理)進行模組化。AOP 的核心構造是方面(切面),它將那些影響多個類的行 為封裝到可重用的模組中。

AOP 程式設計的常用場景有:Authentication 許可權認證、Logging 日誌、Transctions Manager 事務、 Lazy Loading 懶載入、Context Process 上下文處理、Error Handler 錯誤跟蹤(異常捕獲機制) 、Cache 快取。

1.4 Spring5 系統架構
在這裡插入圖片描述
a、核心容器:
由 spring-beans、spring-core、spring-context 和 spring-expression(Spring Expression Language, SpEL) 4 個模組組成。

spring-beans 和 spring-core 模組是 Spring 框架的核心模組,包含了控制反轉(Inversion of Control, IOC)和依賴注入(Dependency Injection, DI)。BeanFactory 介面是 Spring 框架中 的核心介面,它是工廠模式的具體實現。BeanFactory 使用控制反轉對應用程式的配置和依賴性規範與 實際的應用程式程式碼進行了分離。但 BeanFactory 容器例項化後並不會自動例項化 Bean,只有當 Bean 被使用時 BeanFactory 容器才會對該 Bean 進行例項化與依賴關係的裝配。

spring-context 模組構架於核心模組之上,他擴充套件了 BeanFactory,為她新增了 Bean 生命週期 控制、框架事件體系以及資源載入透明化等功能。此外該模組還提供了許多企業級支援,如郵件訪問、 遠端訪問、任務排程等,ApplicationContext 是該模組的核心介面,她是 BeanFactory 的超類,與 BeanFactory 不同,ApplicationContext 容器例項化後會自動對所有的單例項 Bean 進行例項化與 依賴關係的裝配,使之處於待用狀態。

b、AOP 和裝置支援:
由 spring-aop、spring-aspects 和 spring-instrument 3 個模組組成

在 Spring 中,他是以 JVM 的動態代 理技術為基礎,然後設計出了一系列的 AOP 橫切實現,比如前置通知、返回通知、異常通知等,同時, Pointcut 介面來匹配切入點,可以使用現有的切入點來設計橫切面,也可以擴充套件相關方法根據需求進 行切入。
spring-aspects 模組整合自 AspectJ 框架,主要是為 Spring AOP 提供多種 AOP 實現方法。

c、資料訪問及整合:
由 spring-jdbc、spring-tx、spring-orm、spring-jms 和 spring-oxm 5 個 模組組成

spring-jdbc 模組是 Spring 提供的 JDBC 抽象框架的主要實現模組,用於簡化 Spring JDBC。主 要是提供 JDBC 模板方式、關聯式資料庫物件化方式、SimpleJdbc 方式、事務管理來簡化 JDBC 程式設計;

spring-tx 模組是 Spring JDBC 事務控制實現模組。

spring-orm 模組是 ORM 框架支援模組,主要整合 Hibernate, Java Persistence API (JPA) 和 Java Data Objects (JDO) 用於資源管理、資料訪問物件(DAO)的實現和事務策略。

spring-jms 模組(Java Messaging Service)能夠傳送和接受資訊

d.Web:
由 spring-web、spring-webmvc、spring-websocket 和 spring-webflux 4 個模組組 成。
spring-web 模組為 Spring 提供了最基礎 Web 支援,主要建立於核心容器之上,通過 Servlet 或 者 Listeners 來初始化 IOC 容器,也包含一些與 Web 相關的支援。
spring-webmvc 模 塊 眾 所 周 知 是 一 個 的 Web-Servlet 模 塊 , 實 現 了 Spring MVC (model-view-Controller)的 Web 應用。 spring-websocket 模組主要是與 Web 前端的全雙工通訊的協議。

e、報文傳送:
即 spring-messaging 模組。
spring-messaging 是從 Spring4 開始新加入的一個模組,主要職責是為 Spring 框架整合一些基 礎的報文傳送應用。

f.Test:
即 spring-test 模組。
spring-test 模組主要為測試提供支援的

1.5、模組的依賴關係
在這裡插入圖片描述

2、spring5原始碼分析
2.1、什麼是 IOC/DI?

IOC(Inversion of Control)控制反轉:所謂控制反轉,就是把原先我們程式碼裡面需要實現的物件創 建、依賴的程式碼,反轉給容器來幫忙實現。那麼必然的我們需要建立一個容器,同時需要一種描述來讓 容器知道需要建立的物件與物件的關係。這個描述最具體表現就是我們可配置的檔案。
DI(Dependency Injection)依賴注入:就是指物件是被動接受依賴類而不是自己主動去找,換句話說 就是指物件不是從容器中查詢它依賴的類,而是在容器例項化物件的時候主動將它依賴的類注入給它。 先從我們自己設計這樣一個視角來考慮: 物件和物件關係怎麼表示? 可以用 xml,properties 檔案等語義化配置檔案表示。

2.2、Spring 核心容器體系結構
a、BeanFactory

Spring Bean 的建立是典型的工廠模式,這一系列的 Bean 工廠,也即 IOC 容器為開發者管理物件 間的依賴關係提供了很多便利和基礎服務,在 Spring 中有許多的 IOC 容器的實現供使用者選擇和使用, 其相互關係如下:

其中 BeanFactory 作為最頂層的一個介面類,它定義了 IOC 容器的基本功能規範,BeanFactory 有三 個子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。 但是從上圖中我們可以發現最終的預設實現類是 DefaultListableBeanFactory,他實現了所有的接 口。那為何要定義這麼多層次的介面呢?查閱這些介面的原始碼和說明發現,每個介面都有他使用的場合, 它主要是為了區分在 Spring 內部在操作過程中物件的傳遞和轉化過程中,對物件的資料訪問所做的限 制。例如 ListableBeanFactory 介面表示這些 Bean 是可列表的,而 HierarchicalBeanFactory 表 示的是這些 Bean 是有繼承關係的,也就是每個 Bean 有可能有父 Bean。AutowireCapableBeanFactory介面定義 Bean 的自動裝配規則。

ApplicationContext 是 Spring 提供的一個高階的 IOC 容器,它除了能夠提供 IOC 容器的基本功 能外,還為使用者提供了以下的附加服務。 從 ApplicationContext 介面的實現,我們看出其特點:
1.支援資訊源,可以實現國際化。(實現 MessageSource 介面)
2.訪問資源。(實現 ResourcePatternResolver 介面,後面章節會講到)
3.支援應用事件。(實現 ApplicationEventPublisher 介面)

b、BeanDefinition

SpringIOC 容器管理了我們定義的各種 Bean 物件及其相互的關係,Bean 物件在 Spring 實現中是 以 BeanDefinition 來描述的,其繼承體系如下:
在這裡插入圖片描述
c、IOC 容器的初始化

IOC 容器的初始化包括 BeanDefinition 的 Resource 定位、載入和註冊這三個基本的過程。
在這裡插入圖片描述

相關文章