你好,Spring!


交個朋友

拿人錢財替人干活兒,在不影響工作的前提下,想做到很高頻率的更新很難,但是我也盡力輸出,不能為了寫而寫,寧缺毋濫吧。

我的想法是這樣的,接下來的一段時間專門寫Spring框架。整體思路就是:入門知識 --> 實際應用 --> 構建簡易Spring框架 --> 看一下核心模塊源碼,爭取早日寫完這個Spring系列。用最通俗的語言來把“春天”給寫好。

Spring簡介

猜測項目創始人Rod Johnson希望這個框架像春天一樣充滿生機與活力,事實也正如這位音樂專業的計算機大佬所願,截止目前Spring Framework已經更新到Spring 5.3.2版本並在GitHub上已經斬獲40K+的star了。

Spring Framework是一個分層的全棧輕量級框架,目前凡事采用Java語言開發,幾乎都會和它有染。框架內有兩個核心思想:IOC(Inversion Of Control)和AOP(Aspect Oriented Programming),憑借着這兩個思想幫助我們封裝了很多組件,簡化了開發流程,同時它的可擴展性也非常強,因此可以很方便的集成市面上很多優秀的框架,就像王健林的萬達,只要商場建的好,就能吸引很多優秀的商家和買家。

Spring架構總覽

引用一張官圖展示Spring的架構:

file

自上而下可以分為四層:

  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

file

第一張圖展示了在非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棧點公眾號!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM