誕生的背景
什么背景下誕生了該技術?
不論是哪個框架,不會平白無故誕生,不會平白無故地被人所追捧,了解其背景,追根溯源。
讓我們把時間撥回到2002年,當時JAVAEE和EJB正大行其道。Spring的作者覺得其太重了,并不是所有人都需要EJB的功能,因此搞出了一套框架interface21,即Spring的前身。
思考1:Spring和EJB到底孰輕孰重?
回顧歷史,我們來看現在的Spring,實際上其生態已經非常完善,也已經變得非常重,但是我們可以選擇性地使用其特性,而且使用過程中我們對其感知稍弱。
那么EJB呢,為什么Rod Johnson會覺得EJB重呢?我們需要完全地投入到EJB中去,EJB的一些設計理念過于復雜,侵入性強,開發者需要嚴重依賴(Spring現在難道不是嗎)。
思考2:到底什么是輕量級
這里有一個公式:輕量系數=解決的問題/侵入程度。簡單來說就是解決問題的時候,侵入程度越低,就越輕量。
注:EJB當時是Java霸主,官方的標準,可以說Spring誕生于EJB統治的黑暗年代。
它解決了什么痛點、什么問題?
技術沒有銀彈,只有實事求是,解決問題。
當時的開發嚴重依賴EJB,但是對于大多數程序員來說,很難理解和掌握,嚴重影響開發效率。Spring就在這時候帶著其愿景:高效、簡潔、輕量走入了人的視野。
解決的什么痛點:Java應用開發嚴重依賴J2EE的標準規范框架EJB,EJB非常的臃腫,抽象復雜,很難被大眾掌握,影響開發效率。
它有什么優缺點?
沒有完美的技術、完美的框架、完美的實現。
優點:起初Spring非常輕量,僅包括IOC和DI、以及AOP,控制反轉和依賴注入、AOP切面編程讓你用的愛不釋手。
缺點:框架的生態總要發展的,生態越來越多,配置越來越臃腫,它已經不再讓我們感覺到輕量,因為配置太多了。
缺點就是問題,問題就要解決。那么怎么解決的呢,后面我們會分析Spring Boot,到時候就知道了。
有什么核心功能特性、亮點
這個技術有哪些核心的功能,亮點是什么?能給我們帶來什么價值、收益?
Spring最初的核心:IOC和AOP,讓我們可以更輕量的編碼(還記得前面提的什么是輕量嗎)。
通過IOC和DI我們不再需要大量的new對象set對象進行注入,一切交給Spring,我們只需要簡單的在代碼之外的配置(spring.xml)里配置一下bean就行了。一切是多么的美好,因為它輕量。
通過AOP我們實現切面編程,我們可以抽取切面,對公共的能力進行提取,日志、權限、監控,一切更加美好了。
Spring 后來引入了事務管理、MVC,我們的開發更加簡單了。我們摒棄了原來用的Struts、丟掉了原生的JDBC,開發效率大大提高。
核心功能實現原理、追其本質
芒格曾經說過,我們要學習重要學科的重要原理,像我們學習技術一樣,我們要學習主要框架的核心實現原理,了解其本質,了解其解決的痛點,追其本質。
IOC本質是什么?
IOC全稱:Inversion of Control,即控制反轉,是一種設計思想。簡單來說就是把創建對象的任務交給框架,而不是我們自己編碼。
我們一直在說IOC容器,那么容器的本質是什么?
首先我們肯定想到容器嘛,肯定是一種數據結構、比如集合。那么Spring中到底是用什么實現的呢?
如果看過源碼的小伙伴,肯定知道,其底層是一個Map,當然還是ConcurrentHashMap。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
DI依賴注入本質是什么?
有時候我們會說DI是IOC的實現方式。
IOC主要的實現方式有兩種:依賴查找,依賴注入。
AOP的底層原理是什么?
AOP本質是攔截,攔截的本質是代理。
Spring MVC為何誕生?
記得在Spring MVC組件沒出來之前,我們會用什么框架?SSI、SSH(Spring Struts Hibernate)、SSM(當然現在也是SSM)。那么Spring MVC誕生的背景是什么?Struts真的就那么差嗎?這里有必要說一下Java web框架的發展史:JSP/Servlet、Struts1.x、Struts2.x、Spring MVC。
Java Web的發展史
Model 1模型
model 2模型,步入MVC時代
MVC框架誕生
Struts1.x
Struts2.x
思考:為什么Struts2會被淘汰?
答案是:1. 漏洞太多,修不過來;2.Spring 太火了能用Spring 搞定的事情你會用其他框架嗎,這種很少,我們可以看到招聘要求,很多時候都會要求Spring Mybatis這些框架能力,而很少提起Struts2了
Spring MVC
Spring MVC實現原理是什么?本質是什么?
在JSP、Servlet編碼泛濫的那個年代,我們會寫很多的Servlet,Filter,需要調整各種順序,在web.xml里配置各種配置。我們都知道編寫Java Web都離不開其核心Servlet,那么Spring MVC是如何搞的,它能脫離規范嗎?答案是:不能。
Spring MVC離不開Servlet,其本質就是Servlet,然后在Servlet執行的流程上添加了很多特性。
其核心就是DispatcherServlet
Spring MVC工作流程,可以發現其核心就是DispatcherServlet,其他的都是流程中的擴展,讓整個處理流程可以更容易擴展,解耦性更強。
為何如此發展
分析發展路線圖、分析核心版本,追根溯源。
Spring發展史
Spring的核心版圖
可以看到其版圖已經從原來的IOC容器和AOP后來擴張到了Web領域、Dao領域、ORM領域以及一些常用的JEE組件領域。
最后,當然Spring已經延伸出了Spring Boot、Spring Cloud以及現階段的Spring Cloud Data Flow,接下來我們也會一點點剖析其本質。






