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