天天看點

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

第⼀部分 Spring 概述

第1節 Spring 簡介

Spring 是分層的 full-stack(全棧) 輕量級開源架構,以 IoC 和 AOP 為核心,提供了展現層 SpringMVC 和業務層事務管理等衆多的企業級應⽤技術,還能整合開源世界衆多著名的第三⽅架構和類庫,已經成為使⽤最多的 Java EE 企業應⽤開源架構。

Spring 官⽅⽹址:

http://spring.io/

我們經常說的 Spring 其實指的是Spring Framework(spring 架構)。

第2節 Spring 發展曆程

1997年 IBM 提出了EJB的思想;1998年,SUN 制定開發标準規範EJB1.0;

1999年,EJB 1.1釋出; 2001年,EJB 2.0釋出; 2003年,EJB 2.1釋出; 2006年,EJB 3.0釋出;

Rod Johnson(spring之⽗)Expert One-to-One J2EE Design and Development(2002)闡述了J2EE使⽤EJB開發設計的優點及解決⽅案Expert One-to-One J2EE Development without EJB(2004) 闡述了J2EE開發不使⽤EJB的解決⽅式(Spring雛形)

2017 年 9 ⽉份釋出了 Spring 的最新版本 Spring 5.0 通⽤版(GA)

第3節 Spring 的優勢

整個 Spring 優勢,傳達出⼀個信号,Spring 是⼀個綜合性,且有很強的思想性架構,每學習⼀天,就能體會到它的⼀些優勢。

1、⽅便解耦,簡化開發

通過Spring提供的IoC容器,可以将對象間的依賴關系交由Spring進⾏控制,避免寫死所造成的過度程式耦合。⽤戶也不必再為單例模式類、屬性⽂件解析等這些很底層的需求編寫代碼,可以更專注于上層的應⽤。

2、AOP程式設計的⽀持

通過Spring的AOP功能,⽅便進⾏⾯向切⾯的程式設計,許多不容易⽤傳統OOP實作的功能可以通過AOP輕松應付。

聲明式事務的⽀持

3、@Transactional

可以将我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式⽅式靈活的進⾏事務的管理,提⾼開發效率和品質。

⽅便程式的測試

可以⽤⾮容器依賴的程式設計⽅式進⾏⼏乎所有的測試⼯作,測試不再是昂貴的操作,⽽是随⼿可做的事情。

4、⽅便內建各種優秀架構

Spring可以降低各種架構的使⽤難度,提供了對各種優秀架構(Struts、Hibernate、Hessian、Quartz等)的直接⽀持。

5、降低JavaEE API的使⽤難度

Spring對JavaEE API(如JDBC、JavaMail、遠端調⽤等)進⾏了薄薄的封裝層,使這些API的使⽤難度⼤為降低。

6、源碼是經典的 Java 學習範例

Spring的源代碼設計精妙、結構清晰、匠⼼獨⽤,處處展現着⼤師對Java設計模式靈活運⽤以及對Java技術的⾼深造詣。它的源代碼⽆意是Java技術的最佳實踐的範例。

第4節 Spring 的核⼼結構

Spring是⼀個分層⾮常清晰并且依賴關系、職責定位⾮常明确的輕量級架構,主要包括⼏個⼤子產品:資料處理子產品、Web子產品、AOP(Aspect Oriented Programming)/Aspects子產品、Core Container子產品和 Test 子產品,如下圖所示,Spring依靠這些基本子產品,實作了⼀個令⼈愉悅的融合了現有解決⽅案的零侵⼊的輕量級架構。

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

Spring核⼼容器(Core Container) 容器是Spring架構最核⼼的部分,它管理着Spring應⽤中bean的建立、配置和管理。在該子產品中,包括了Spring bean⼯⼚,它為Spring提供了DI的功能。基于bean⼯⼚,我們還會發現有多種Spring應⽤上下⽂的實作。所有的Spring子產品都建構于核⼼容器之上。

⾯向切⾯程式設計(AOP)/Aspects Spring對⾯向切⾯程式設計提供了豐富的⽀持。這個子產品是Spring應⽤系統中開發切⾯的基礎,與DI⼀樣,AOP可以幫助應⽤對象解耦。

資料通路與內建(Data Access/Integration)

Spring的JDBC和DAO子產品封裝了⼤量樣闆代碼,這樣可以使得資料庫代碼變得簡潔,也可以更專注于我們的業務,還可以避免資料庫資源釋放失敗⽽引起的問題。另外,Spring AOP為資料通路提供了事務管理服務,同時Spring還對ORM進⾏了內建,如Hibernate、MyBatis等。該子產品由JDBC、Transactions、ORM、OXM 和 JMS 等子產品組成。           

1

複制代碼

Web 該子產品提供了SpringMVC架構給Web應⽤,還提供了多種建構和其它應⽤互動的遠端調⽤⽅案。SpringMVC架構在Web層提升了應⽤的松耦合⽔平。

Test 為了使得開發者能夠很⽅便的進⾏測試,Spring提供了測試子產品以緻⼒于Spring應⽤的測試。通過該子產品,Spring為使⽤Servlet、JNDI等編寫單元測試提供了⼀系列的mock對象實作。

第5節 Spring 架構版本

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

Spring Framework不同版本對 Jdk 的要求

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

JDK 11.0.5

IDE idea 2019

Maven 3.6.x

第⼆部分 核⼼思想

注意:IOC和AOP不是spring提出的,在spring之前就已經存在,隻不過更偏向于理論化,spring在技術層次把這兩個思想做了⾮常好的實作(Java)

第1節 IoC

1.1 什麼是IoC?

1、IoC Inversion of Control (控制反轉/反轉控制),注意它是⼀個技術思想,不是⼀個技術實作描述的事情:Java開發領域對象的建立,管理的問題

2、傳統開發⽅式:⽐如類A依賴于類B,往往會在類A中new⼀個B的對象

3、IoC思想下開發⽅式:我們不⽤⾃⼰去new對象了,⽽是由IoC容器(Spring架構)去幫助我們執行個體化對象并且管理它,我們需要使⽤哪個對象,去問IoC容器要即可

4、我們喪失了⼀個權利(建立、管理對象的權利),得到了⼀個福利(不⽤考慮對象的建立、管理等⼀系列事情)

5、為什麼叫做控制反轉?控制:指的是對象建立(執行個體化、管理)的權利反轉:控制權交給外部環境了(spring架構、IoC容器)

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

1.2 IoC解決了什麼問題

IoC解決對象之間的耦合問題

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

1.3 IoC和DI的差別

DI:Dependancy Injection(依賴注⼊)

怎麼了解:

IOC和DI描述的是同⼀件事情,隻不過⻆度不⼀樣罷了

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

第2節 AOP

2.1 什麼是AOP

AOP: Aspect oriented Programming ⾯向切⾯程式設計/⾯向⽅⾯程式設計

AOP是OOP的延續,從OOP說起

OOP三⼤特征:封裝、繼承和多态

oop是⼀種垂直繼承體系

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

OOP程式設計思想可以解決⼤多數的代碼重複問題,但是有⼀些情況是處理不了的,⽐如下⾯的在頂級⽗類Animal中的多個⽅法中相同位置出現了重複代碼,OOP就解決不了

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

橫切邏輯代碼

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

橫切邏輯代碼存在什麼問題:

橫切代碼重複問題

橫切邏輯代碼和業務代碼混雜在⼀起,代碼臃腫,維護不⽅便AOP出場,AOP獨辟蹊徑提出橫向抽取機制,将橫切邏輯代碼和業務邏輯代碼分析

阿裡技術官精心整理的Spring源碼文檔,由淺入深徹底全面解析Spring源碼

代碼拆分容易,那麼如何在不改變原有業務邏輯的情況下,悄⽆聲息的把橫切邏輯代碼應⽤到原有的業務邏輯中,達到和原來⼀樣的效果,這個是⽐較難的

2.2 AOP

在解決什麼問題在不改變原有業務邏輯情況下,增強橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重複

2.3 為什麼叫做⾯向切⾯程式設計

「切」:指的是橫切邏輯,原有業務邏輯代碼我們不能動,隻能操作橫切邏輯代碼,是以⾯向橫切邏輯

「⾯」:橫切邏輯代碼往往要影響的是很多個⽅法,每⼀個⽅法都如同⼀個點,多個點構成⾯,有⼀個⾯的概念在⾥⾯

以上文章隻是Spring進階源碼中的一部分,需要的可以關注公衆号:有故事的程式員,背景私信【電子書】擷取完整版的《Spring進階源碼》!

如果本文對你有幫助,别忘記來個三連:點贊,轉發,評論。咱們下期見!