你好,Spring!
阿新 • • 發佈:2020-12-28
### 交個朋友
拿人錢財替人幹活兒,在不影響工作的前提下,想做到很高頻率的更新很難,但是我也盡力輸出,不能為了寫而寫,寧缺毋濫吧。
我的想法是這樣的,接下來的一段時間專門寫Spring框架。整體思路就是:入門知識 --> 實際應用 --> 構建簡易Spring框架 --> 看一下核心模組原始碼,爭取早日寫完這個Spring系列。用最通俗的語言來把“春天”給寫好。
### Spring簡介
猜測專案創始人Rod Johnson希望這個框架像春天一樣充滿生機與活力,事實也正如這位音樂專業的計算機大佬所願,截止目前[Spring Framework](https://github.com/spring-projects/spring-framework)已經更新到[Spring 5.3.2](https://spring.io/projects/spring-framework#learn)版本並在GitHub上已經斬獲40K+的star了。
Spring Framework是一個分層的全棧輕量級框架,目前凡事採用Java語言開發,幾乎都會和它有染。框架內有兩個核心思想:IOC(Inversion Of Control)和AOP(Aspect Oriented Programming),憑藉著這兩個思想幫助我們封裝了很多元件,簡化了開發流程,同時它的可擴充套件性也非常強,因此可以很方便的整合市面上很多優秀的框架,就像王健林的萬達,只要商場建的好,就能吸引很多優秀的商家和買家。
#### Spring架構總覽
引用一張官圖展示Spring的架構:
![file](https://img2020.cnblogs.com/other/2120441/202012/2120441-20201228102650262-1146015128.png)
自上而下可以分為四層:
1. 第一層分為兩個模組:
1. 資料訪問層,具體組成圖中有展示,主要是封裝了JDBC操作過程中的很多模板化程式碼。由於對ORM對映的支援,集成了MyBatis以及Hibernate等很哇塞的持久層框架
2. web層,支援Servlet協議以及WebSocket等通訊協議,使得能夠同其它應用實現遠端通訊及相互呼叫。同時支援使用SpringMVC對該層進行擴充套件。
2. 主要是對AOP的一些支援,是我們使用切面程式設計的支撐,AOP的存在幫助我們提取程式碼中的一些非業務功能的公共邏輯。
3. Core Container,Spring的核心部分,所有Bean的建立,配置以及生命週期管理都在這個模組中,屬於閻王爺的生死簿級別。控制反轉思想的實現也正是基於這個核心模組實現的,而且是面試必問的,必問!必問!
4. Test層,這裡提供單元測試,Mock測試等功能,目的是方便使用Spring框架的開發人員能夠更輕鬆的寫單元測試。
### 核心思想概述
#### IOC
**英文名**:Inversion Of Control
**中文名**:控制反轉
**主要技能**:物件間解耦合,不用關心物件的建立,配置以及生命週期的管理,一切都交給框架管理。這裡就反映了Spring的設計思想,靈活運用了工廠模式,單例模式以及原型模式等等
下面分別用兩張圖對比展示IOC思想帶來的好處:
![file](https://img2020.cnblogs.com/other/2120441/202012/2120441-20201228102650990-1186829680.png)
![file](https://img2020.cnblogs.com/other/2120441/202012/2120441-20201228102652153-583864733.png)
第一張圖展示了在非IOC容器中傳統的通過new關鍵字建立物件並實現物件間關聯,這種方式在比較大的專案中,一個類A可能要被幾十上百個類引用,如果這個類A中的業務發生變化,那麼後果就是牽一髮動全身,程式碼的可維護性和擴充套件性大大降低。
第二張圖在IOC容器的支援下,Java物件的管理方式得到了本質上的改變,所有物件都交給IOC容器統一管理,統一分配,統一管理(這麼說太絕對了,因為當Bean的Scope屬性為prototype時,物件建立後就不由IOC容器控制了,可以暫且這麼理解,後邊會詳細說明),某個類依賴的物件直接由IOC容器包分配。
IOC容器的建立,還引入了另外一個概念,叫DI--Dependancy Injection即常說的依賴注入。也是一個概念性的東西,用來描述IOC容器中Bean物件之間關係的。打個比方,一大堆單身男女(各種Class的Bean物件)想在今天這個平安夜脫單,並且帶著自己的擇偶標準(依賴的其他物件),於是找到了某交友APP就叫IOC,那麼IOC有了這些人(Bean)的資訊以後,就可以按需(依賴)分配了。這個分配過程就是依賴注入--DI。那如果張三指明說喜歡李四,李四喜歡王五,而王五卻喜歡張三,這就是迴圈依賴。Spring的解決辦法是利用三級快取,細節部分會在後面的文章中闡述。
#### AOP
**英文名**:Aspect Oriented Programming
**中文名**:面向方便麵程式設計
**主要技能**:可以將模板化的,通過OOP無法解決的邏輯程式碼提取出來,比如說統計一個方法執行耗時,需要在方法入口和出口分別列印並計算耗時,或者是建立事務,進入方法時建立事務,方法結束時提交或者回滾事務(這個Spring基於AOP已經實現了宣告式事務),再或者是訪問許可權控制等等。這類程式碼是無法通過提取父類來完成的。我個人理解,AOP彌補了Java原生OOP的不足之處。
假設有個婚介所叫AOP,單身男女都想找物件而且都對身高有嚴格要求,在沒有AOP婚介所的時候,所有單身男女都要在相親角拿著尺子互量身高,符合條件才能處物件,那量身高這個動作本身是跟相親這個業務是無關的,而且有很多人都要量,那麼AOP婚介所來了,同時提供了量身高的服務,只要張三找的物件是經過AOP婚介所對的,那麼就是符合張三要求的,這樣就把所有人(Bean)的公共的非業務需求利用AOP思想提取出來了,方便維護和重用。
而AOP的實現又是基於代理,代理又分為靜態代理和動態代理,動態代理也有兩種方式:JDK提供的面向介面代理的Proxy代理類和CGlib動態代理,在Spring中當使用AOP進行橫切時,如果目標類的上層有介面,預設會採用JDK代理技術,反之使用CGlib代理,也能夠在XML配置或者註解中強制使用CGlib進行代理。CGLib底層採用ASM位元組碼生成框架,並在位元組碼層生成被代理物件的子類,有興趣的同學可以研究一下Java位元組碼生成開源框架Javassist和ASM,以及Javaagent,用於構建獨立於應用程式的代理程式,常見的熱部署工具Jrebel就是基於這一原理實現的。都是很牛X的技術,後邊可能會寫,不關注一波可就虧大了。
### 總結
Spring太哇塞了!下一篇會用程式碼的形式實現“IOC交友APP”
和“AOP婚介所”用盡可能俗的文字和程式碼說明白為什麼需要IOC(臥龍)和AOP(鳳雛),他倆到底解決了什麼問題!!
更多文章請微信搜尋**Java棧點**公