第⼀部分 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核⼼容器(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 Framework不同版本對 Jdk 的要求
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容器)
1.2 IoC解決了什麼問題
IoC解決對象之間的耦合問題
1.3 IoC和DI的差別
DI:Dependancy Injection(依賴注⼊)
怎麼了解:
IOC和DI描述的是同⼀件事情,隻不過⻆度不⼀樣罷了
第2節 AOP
2.1 什麼是AOP
AOP: Aspect oriented Programming ⾯向切⾯程式設計/⾯向⽅⾯程式設計
AOP是OOP的延續,從OOP說起
OOP三⼤特征:封裝、繼承和多态
oop是⼀種垂直繼承體系
OOP程式設計思想可以解決⼤多數的代碼重複問題,但是有⼀些情況是處理不了的,⽐如下⾯的在頂級⽗類Animal中的多個⽅法中相同位置出現了重複代碼,OOP就解決不了
橫切邏輯代碼
橫切邏輯代碼存在什麼問題:
橫切代碼重複問題
橫切邏輯代碼和業務代碼混雜在⼀起,代碼臃腫,維護不⽅便AOP出場,AOP獨辟蹊徑提出橫向抽取機制,将橫切邏輯代碼和業務邏輯代碼分析
代碼拆分容易,那麼如何在不改變原有業務邏輯的情況下,悄⽆聲息的把橫切邏輯代碼應⽤到原有的業務邏輯中,達到和原來⼀樣的效果,這個是⽐較難的
2.2 AOP
在解決什麼問題在不改變原有業務邏輯情況下,增強橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重複
2.3 為什麼叫做⾯向切⾯程式設計
「切」:指的是橫切邏輯,原有業務邏輯代碼我們不能動,隻能操作橫切邏輯代碼,是以⾯向橫切邏輯
「⾯」:橫切邏輯代碼往往要影響的是很多個⽅法,每⼀個⽅法都如同⼀個點,多個點構成⾯,有⼀個⾯的概念在⾥⾯
以上文章隻是Spring進階源碼中的一部分,需要的可以關注公衆号:有故事的程式員,背景私信【電子書】擷取完整版的《Spring進階源碼》!
如果本文對你有幫助,别忘記來個三連:點贊,轉發,評論。咱們下期見!