『互聯(lián)網(wǎng)架構(gòu)』軟件架構(gòu)-spring源碼之spring結(jié)構(gòu)概述

spring從07年接觸到目前2018年也差不多10年了弓颈,一個(gè)java的框架為什么能火這么多年。很多人對spring的使用輕車熟路鸠姨,但是從未解讀過spring的源碼坯屿,老鐵跟我一起看看源碼,了解下內(nèi)部的構(gòu)造检激,只有源碼讀過的人才能獲得上乘武功肴捉,軟件開發(fā)不只是搬磚的老鐵。內(nèi)功熟悉原理呵扛,外功是靈活使用每庆。內(nèi)功好比電力,外功好比電機(jī)今穿。內(nèi)功的電力越強(qiáng),電機(jī)的馬力越大才能發(fā)揮巨大作用伦籍,相反如果電力弱蓝晒,馬力在強(qiáng)也是不行的。spring從單一的jar包帖鸦,發(fā)展到現(xiàn)在十多個(gè)jar包芝薇,spring mvc 到spring boot 到spring cloud,從需要配置到現(xiàn)在0配置作儿,封裝的越來越厲害洛二,導(dǎo)致的結(jié)果,如果不了解內(nèi)核在強(qiáng)的馬力,遇到問題可能無從下手晾嘶。一起熟讀spring源碼尤為重要妓雾。

spring

從我開始java的編程開始一直都陪伴這我。第一次接觸spring是在07年接觸它的垒迂。從java的編程生涯一直在用spring械姻,目前還沒去過那個(gè)公司沒用spring的。記得那時(shí)候流行是ssh(struts+spring+hibernate)机断,每個(gè)人都會(huì)在簡歷上寫上精通ssh楷拳,這3個(gè)框架號稱是三駕馬車。隨著spring的發(fā)展越來越龐大吏奸,它從中間的服務(wù)欢揖,慢慢升級為往上走spring mvc,往下走是spring jdbc奋蔚,springvm浸颓,隨著struts和hibernate慢慢的使用下降,struts慢慢被spring mvc替換旺拉,hiberntate已經(jīng)基本被mybatis替換了产上。截止到我寫這篇文章的時(shí)候spring v5.1.3


?2002年開發(fā)者Juergen Hoeller和Yann Caroff說服Rod Johnson創(chuàng)建一個(gè)基于基礎(chǔ)結(jié)構(gòu)代碼的開源項(xiàng)目。Rod蛾狗,Juergen和Yann于2003年2月左右開始合作該項(xiàng)目晋涣。Yan為新框架創(chuàng)造了“Spring”的名字。據(jù)Rod介紹沉桌,Spring是傳統(tǒng)J2EE的“冬天”之后的新開始谢鹊!?


Rod Johnson的書以非常詳盡,詳實(shí)和實(shí)用的方式介紹了J2EE最佳實(shí)踐的世界留凭。從編碼標(biāo)準(zhǔn)佃扼,idioms,單元測試蔼夜,設(shè)計(jì)決策兼耀,持久性,緩存求冷,EJB瘤运,model-2表示層,視圖匠题,驗(yàn)證技術(shù)到性能的公平批評拯坟,讀者都可以體會(huì)從理論到實(shí)踐,制約因素韭山,風(fēng)險(xiǎn)以及最佳做法郁季。本書確實(shí)是一個(gè)知識庫冷溃。


2003年6月,Spring 0.9在Apache 2.0許可下發(fā)布梦裂。2004年3月似枕,1.0版發(fā)布。有趣的是塞琼,即使在1.0發(fā)布之前菠净,spring也被開發(fā)人員廣泛采用。2004年8月彪杉,Rod Johnson毅往,Juergen Hoeller,Keith Donald和Colin Sampaleanu共同創(chuàng)立了一家專注于Spring咨詢派近,培訓(xùn)和支持的公司interface21攀唯。


Yann Caroff在早期離開了團(tuán)隊(duì)。Rod Johnson在2012年離開了團(tuán)隊(duì)渴丸。Juergen Hoeller仍然是Spring開發(fā)團(tuán)隊(duì)的積極成員侯嘀。


自2004年1.0版本發(fā)布以來,Spring框架迅速發(fā)展谱轨。Spring 2.0于2006年10月發(fā)布戒幔,到那時(shí),Spring的下載量超過了100萬土童。Spring 2.0具有可擴(kuò)展的XML配置功能诗茎,用于簡化XML配置,支持Java 5献汗,額外的IoC容器擴(kuò)展敢订,支持動(dòng)態(tài)語言(如groovy,aop增強(qiáng)功能和新的bean范圍)罢吃。


在Rod領(lǐng)導(dǎo)下管理Spring項(xiàng)目的Interface21公司于2007年11月更名為SpringSource楚午。同時(shí)發(fā)布了Spring 2.5。Spring 2.5中的主要新功能包括支持Java 6/Java EE 5尿招,支持注釋配置矾柜,classpath中的組件自動(dòng)檢測和兼容OSGi的bundle。

2007年泊业,SpringSource從資本獲得了A輪融資(1000萬美元)把沼。SpringSource在2008年通過來自加速合作伙伴和B輪融資籌集了額外資本。

SpringSource在此期間收購了多家公司(Covalent吁伺,Hyperic,G2One等)租谈。2009年8月篮奄,SpringSource以4.2億美元被VMWare收購捆愁!

SpringSource在幾周內(nèi)收購了cloud foundry,這是一家云PaaS提供商窟却。2015年昼丑,cloud foundry轉(zhuǎn)移到了非營利cloud foundry基金會(huì)。


2009年12月夸赫,Spring 3.0發(fā)布菩帝。Spring 3.0具有許多重要特性,如重組模塊系統(tǒng)茬腿,支持Spring表達(dá)式語言呼奢,基于Java的bean配置(JavaConfig),支持嵌入式數(shù)據(jù)庫(如HSQL切平,H2和Derby)握础,模型驗(yàn)證/ REST支持和對Java EE 6的支持。


2011年和2012年發(fā)布了許多3.x系列的小版本悴品。2012年7月禀综,Rod Johnson離開了團(tuán)隊(duì)。2013年4月苔严,VMware和EMC通過GE投資創(chuàng)建了一家名為Pivotal的合資企業(yè)定枷。所有的6應(yīng)用項(xiàng)目都轉(zhuǎn)移到了Pivotal。


2013年12月届氢,Pivotal宣布發(fā)布Spring框架4.0欠窒。Spring 4.0是Spring框架的一大進(jìn)步,它包含了對Java 8的全面支持悼沈,更高的第三方庫依賴性(groovy 1.8+贱迟,ehcache 2.1+,hibernate 3.6+等)絮供,Java EE 7支持衣吠,groovy DSL for bean定義,對websockets的支持以及對泛型類型的支持作為注入bean的限定符壤靶。


2014年至2017年期間發(fā)布了許多Spring框架4.x.x版本缚俏。當(dāng)前的Spring框架版本(4.3.7)于2017年3月發(fā)布。Spring框架4.3.8于2017年4月發(fā)布贮乳,并將成為4.x系列中的最后一個(gè)忧换。Spring框架的下一個(gè)延續(xù)的主要版本是在5.0版本展開。


####架構(gòu)?

?

每個(gè)模塊的功能如下:

?

核心容器(Core Container) 核心容器包括?spring-core?向拆,?spring-beans?亚茬,?spring-context?,?spring-context-support和?spring-expression?(SpEL浓恳,Spring表達(dá)式語言刹缝,Spring Expression Language)等模塊碗暗。?


spring-core和?spring-beans?模塊是[Spring框架的基礎(chǔ)],包括控制反轉(zhuǎn)和依賴注入等功能梢夯。BeanFactory是工廠模式的微妙實(shí)現(xiàn)言疗,它移除了編碼式單例的需要,并且可以把配置和依賴從實(shí)際編碼邏輯中解耦颂砸。


[Context](?spring-context?)模塊是在[Core和Bean]模塊的基礎(chǔ)上建立起來的噪奄,它以一種類似于JNDI注冊的方式訪問對象。Context模塊繼承自Bean模塊人乓,并且添加了國際化(比如勤篮,使用資源束)、事件傳播撒蟀、資源加載和透明地創(chuàng)建上下文(比如叙谨,通過Servelet容器)等功能。Context模塊也支持Java EE的功能保屯,比如EJB手负、JMX和遠(yuǎn)程調(diào)用等。?ApplicationContext?接口是Context模塊的焦點(diǎn)姑尺。?spring-context-support?提供了對第三方庫集成到Spring上下文的支持竟终,比如緩存(EhCache, Guava, JCache)、郵件(JavaMail)切蟋、調(diào)度(CommonJ, Quartz)统捶、模板引擎(FreeMarker, JasperReports, Velocity)等。



spring-expression模塊提供了強(qiáng)大的[表達(dá)式語言]用于在運(yùn)行時(shí)查詢和操作對象圖柄粹。它是JSP2.1規(guī)范中定義的統(tǒng)一表達(dá)式語言的擴(kuò)展喘鸟,支持set和get屬性值、屬性賦值驻右、方法調(diào)用什黑、訪問數(shù)組集合及索引的內(nèi)容、邏輯算術(shù)運(yùn)算堪夭、命名變量愕把、通過名字從Spring IoC容器檢索對象,還支持列表的投影森爽、選擇以及聚合等恨豁。

AOP和檢測(Instrumentation)

spring-aop模塊提供了[面向切面編程](AOP)的實(shí)現(xiàn),可以定義諸如方法攔截器和切入點(diǎn)等爬迟,從而使實(shí)現(xiàn)功能的代碼徹底的解耦出來橘蜜。使用源碼級的元數(shù)據(jù),可以用類似于.Net屬性的方式合并行為信息到代碼中付呕。



spring-aspects模塊提供了對AspectJ的集成扮匠。

spring-instrument模塊提供了對檢測類的支持和用于特定的應(yīng)用服務(wù)器的類加載器的實(shí)現(xiàn)捧请。javaagent 的支持和類加載器凡涩。?spring-instrument-tomcat?模塊包含了用于tomcat的Spring檢測代理棒搜。

消息處理(messaging)

Spring 4 包含的?spring-messaging?模塊是從Spring集成項(xiàng)目的關(guān)鍵抽象中提取出來的,這些項(xiàng)目包括?Message?活箕、?MessageChannel?力麸、?MessageHandler?和其它服務(wù)于消息處理的項(xiàng)目。這個(gè)模塊也包含一系列的注解用于映射消息到方法育韩,這類似于Spring MVC基于編碼模型的注解克蚂。


數(shù)據(jù)訪問與集成


數(shù)據(jù)訪問與集成層包含JDBC、ORM筋讨、OXM埃叭、JMS和事務(wù)模塊。


(譯者注:JDBC=Java Data Base Connectivity悉罕,ORM=Object Relational Mapping赤屋,OXM=Object XML Mapping,JMS=Java Message Service)


spring-jdbc模塊提供了[JDBC]抽象層壁袄,它消除了冗長的JDBC編碼和對?數(shù)據(jù)庫?供應(yīng)商特定錯(cuò)誤代碼的解析类早。


spring-tx模塊支持[編程式事務(wù)和聲明式事務(wù)],可用于實(shí)現(xiàn)了特定接口的類和所有的POJO對象嗜逻。?


(譯者注:編程式事務(wù)需要自己寫beginTransaction()涩僻、commit()、rollback()等事務(wù)管理方法栈顷,聲明式事務(wù)是通過注解或配置由spring自動(dòng)處理逆日,編程式事務(wù)粒度更細(xì)) spring-orm模塊提供了對流行的[對象關(guān)系映射]API的集成,包括[JPA]萄凤、[JDO]和[Hibernate]等室抽。


通過此模塊可以讓這些ORM框架和spring的其它功能整合,比如前面提及的事務(wù)管理蛙卤。


?spring-oxm模塊提供了對[OXM]實(shí)現(xiàn)的支持狠半,比如JAXB、Castor颤难、XML Beans神年、JiBX、XStream等行嗤。 spring-jms模塊包含生產(chǎn)(produce)和消費(fèi)(consume)消息的功能已日。從Spring 4.1開始,集成了?spring-messaging?模塊栅屏。


?Web?


Web層包括?spring-web?飘千、?spring-webmvc?堂鲜、?spring-websocket?、?spring-webmvc-portlet?等模塊护奈。


spring-web模塊提供面向web的基本功能和面向web的應(yīng)用上下文缔莲,比如多部分(multipart)文件上傳功能、使用Servlet監(jiān)聽器初始化IoC容器等霉旗。它還包括HTTP客戶端以及Spring遠(yuǎn)程調(diào)用中與web相關(guān)的部分痴奏。


spring-webmvc模塊(即Web-Servlet模塊)為web應(yīng)用提供了模型視圖控制([MVC])和REST Web服務(wù)的實(shí)現(xiàn)。Spring的MVC框架可以使領(lǐng)域

模型代碼和web表單完全地分離厌秒,且可以與Spring框架的其它所有功能進(jìn)行集成读拆。

spring-webmvc-portlet模塊(即Web-Portlet模塊)提供了用于Portlet環(huán)境的MVC實(shí)現(xiàn),并反映了?spring-webmvc?模塊的功能鸵闪。

Test


spring-test模塊通過JUnit和TestNG組件支持[單元測試]和[集成測試]檐晕。它提供了一致性地[加載]和[緩存]Spring上下文,也提供了用于單獨(dú)測試代碼的[模擬對象](mock object)蚌讼。


下載spring fremwork 源碼


>配置加速功能Windows環(huán)境


C:\Windows\System32\drivers\etc\hosts


最末尾添加兩句話:

151.101.185.194?http://github.global.ssl.fastly.net

192.30.253.112?http://github.com

配置加速功能辟灰,linux環(huán)境


vi /etc/hosts

/etc/init.d/networking restart

添加

151.101.185.194?http://github.global.ssl.fastly.net


192.30.253.112?http://github.com git clone https://github.com/spring-projects/spring-framework.git #切換到對應(yīng)分支 git checkout -b v4.3.8 v4.3.8.RELEASE?


idea直接導(dǎo)入就可以了,如果沒有g(shù)radle idea會(huì)自動(dòng)下載的

面試場景回顧


回顧下之前的面試經(jīng)歷

說下spring IOC

> 在沒有spring ioc的時(shí)候啦逆,我們?nèi)绻枰褂靡粋€(gè)類的時(shí)候伞矩,

1.通過new的方式

2.通過另一個(gè)類new出來然后傳遞到指定需要的類里面

無論這2個(gè)那種方式,都會(huì)使我們之前的依賴關(guān)系很混亂夏志,代碼里面到處是new乃坤,而且服務(wù)的初始化也很混亂。

有了IOC的容器的話可以使服務(wù)類或者bean沟蔑,進(jìn)行一個(gè)管理湿诊,然后通過聲明注入的方式到指定的類里面,里面用到了xml技術(shù)才可以對我們bean進(jìn)行定義和解析瘦材,這就是反射的技術(shù)厅须,才可以把一個(gè)bean注入到另一個(gè)bean里面,里面也用到了抽象工廠的模式食棕。說實(shí)在的就是給程序員節(jié)省時(shí)間朗和,說這句是不是無懈可擊。

PS:直擊源碼的學(xué)習(xí)簿晓,springboot和springcloud慢慢主流眶拉,很多大型框架的思路都是借鑒了spring,相信讀懂了常用的spring源碼后憔儿,以后的路會(huì)越走越寬廣忆植。會(huì)在后面的博文里面多加入更多自己的心得體會(huì),更加詳細(xì)的一起學(xué)習(xí)spring源碼。


在此我向大家推薦一個(gè)java互聯(lián)網(wǎng)架構(gòu)學(xué)習(xí)交流群朝刊。交流學(xué)習(xí)Q群號:815220368 加群獲得以上學(xué)習(xí)視頻耀里,群里面還會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis拾氓,Netty源碼分析冯挎,高并發(fā)、高性能痪枫、分布式织堂、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化奶陈、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源附较,目前受益良多

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吃粒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拒课,更是在濱河造成了極大的恐慌徐勃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件早像,死亡現(xiàn)場離奇詭異僻肖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卢鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門臀脏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冀自,你說我怎么就攤上這事揉稚。” “怎么了熬粗?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵搀玖,是天一觀的道長。 經(jīng)常有香客問我驻呐,道長灌诅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任含末,我火速辦了婚禮猜拾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘答渔。我一直安慰自己关带,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宋雏,像睡著了一般芜飘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磨总,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天嗦明,我揣著相機(jī)與錄音切省,去河邊找鬼欺栗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摆屯,可吹牛的內(nèi)容都是我干的馆纳。 我是一名探鬼主播诗良,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲁驶!你這毒婦竟也來了鉴裹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤钥弯,失蹤者是張志新(化名)和其女友劉穎径荔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脆霎,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡总处,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睛蛛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹦马。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖玖院,靈堂內(nèi)的尸體忽然破棺而出菠红,到底是詐尸還是另有隱情,我是刑警寧澤难菌,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布试溯,位于F島的核電站,受9級特大地震影響郊酒,放射性物質(zhì)發(fā)生泄漏遇绞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一燎窘、第九天 我趴在偏房一處隱蔽的房頂上張望摹闽。 院中可真熱鬧,春花似錦褐健、人聲如沸付鹿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舵匾。三九已至俊抵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坐梯,已是汗流浹背徽诲。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吵血,地道東北人谎替。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蹋辅,于是被迫代替她去往敵國和親钱贯。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容