原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請注明:轉(zhuǎn)載自IT人故事會,謝謝!
原文鏈接地址:『互聯(lián)網(wǎng)架構(gòu)』軟件架構(gòu)-spring源碼之spring結(jié)構(gòu)概述(八)
spring從07年接觸到目前2018年也差不多10年了,一個java的框架為什么能火這么多年。很多人對spring的使用輕車熟路,但是從未解讀過spring的源碼,老鐵跟我一起看看源碼,了解下內(nèi)部的構(gòu)造,只有源碼讀過的人才能獲得上乘武功,軟件開發(fā)不只是搬磚的老鐵。內(nèi)功熟悉原理,外功是靈活使用。內(nèi)功好比電力,外功好比電機。內(nèi)功的電力越強,電機的馬力越大才能發(fā)揮巨大作用,相反如果電力弱,馬力在強也是不行的。spring從單一的jar包,發(fā)展到現(xiàn)在十多個jar包,spring mvc 到spring boot 到spring cloud,從需要配置到現(xiàn)在0配置,封裝的越來越厲害,導致的結(jié)果,如果不了解內(nèi)核在強的馬力,遇到問題可能無從下手。一起熟讀spring源碼尤為重要。

spring
歷史
官網(wǎng):https://github.com/spring-projects/spring-framework
從我開始java的編程開始一直都陪伴這我。第一次接觸spring是在07年接觸它的。從java的編程生涯一直在用spring,目前還沒去過那個公司沒用spring的。記得那時候流行是ssh(struts+spring+hibernate),每個人都會在簡歷上寫上精通ssh,這3個框架號稱是三駕馬車。隨著spring的發(fā)展越來越龐大,它從中間的服務(wù),慢慢升級為往上走spring mvc,往下走是spring jdbc,springvm,隨著struts和hibernate慢慢的使用下降,struts慢慢被spring mvc替換,hiberntate已經(jīng)基本被mybatis替換了。截止到我寫這篇文章的時候spring v5.1.3

2002年開發(fā)者Juergen Hoeller和Yann Caroff說服Rod Johnson創(chuàng)建一個基于基礎(chǔ)結(jié)構(gòu)代碼的開源項目。Rod,Juergen和Yann于2003年2月左右開始合作該項目。Yan為新框架創(chuàng)造了“Spring”的名字。據(jù)Rod介紹,Spring是傳統(tǒng)J2EE的“冬天”之后的新開始!
Rod Johnson的書以非常詳盡,詳實和實用的方式介紹了J2EE最佳實踐的世界。從編碼標準,idioms,單元測試,設(shè)計決策,持久性,緩存,EJB,model-2表示層,視圖,驗證技術(shù)到性能的公平批評,讀者都可以體會從理論到實踐,制約因素,風險以及最佳做法。本書確實是一個知識庫。
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咨詢,培訓和支持的公司interface21。
Yann Caroff在早期離開了團隊。Rod Johnson在2012年離開了團隊。Juergen Hoeller仍然是Spring開發(fā)團隊的積極成員。
自2004年1.0版本發(fā)布以來,Spring框架迅速發(fā)展。Spring 2.0于2006年10月發(fā)布,到那時,Spring的下載量超過了100萬。Spring 2.0具有可擴展的XML配置功能,用于簡化XML配置,支持Java 5,額外的IoC容器擴展,支持動態(tài)語言(如groovy,aop增強功能和新的bean范圍)。
在Rod領(lǐng)導下管理Spring項目的Interface21公司于2007年11月更名為SpringSource。同時發(fā)布了Spring 2.5。Spring 2.5中的主要新功能包括支持Java 6/Java EE 5,支持注釋配置,classpath中的組件自動檢測和兼容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基金會。
2009年12月,Spring 3.0發(fā)布。Spring 3.0具有許多重要特性,如重組模塊系統(tǒng),支持Spring表達式語言,基于Java的bean配置(JavaConfig),支持嵌入式數(shù)據(jù)庫(如HSQL,H2和Derby),模型驗證/ REST支持和對Java EE 6的支持。
2011年和2012年發(fā)布了許多3.x系列的小版本。2012年7月,Rod Johnson離開了團隊。2013年4月,VMware和EMC通過GE投資創(chuàng)建了一家名為Pivotal的合資企業(yè)。所有的6應(yīng)用項目都轉(zhuǎn)移到了Pivotal。
2013年12月,Pivotal宣布發(fā)布Spring框架4.0。Spring 4.0是Spring框架的一大進步,它包含了對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版本。當前的Spring框架版本(4.3.7)于2017年3月發(fā)布。Spring框架4.3.8于2017年4月發(fā)布,并將成為4.x系列中的最后一個。Spring框架的下一個延續(xù)的主要版本是在5.0版本展開。

架構(gòu)

每個模塊的功能如下:
核心容器(Core Container)
核心容器包括spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring表達式語言,Spring Expression Language)等模塊。
spring-core和spring-beans模塊是[Spring框架的基礎(chǔ)],包括控制反轉(zhuǎn)和依賴注入等功能。BeanFactory是工廠模式的微妙實現(xiàn),它移除了編碼式單例的需要,并且可以把配置和依賴從實際編碼邏輯中解耦。
[Context](spring-context)模塊是在[Core和Bean]模塊的基礎(chǔ)上建立起來的,它以一種類似于JNDI注冊的方式訪問對象。Context模塊繼承自Bean模塊,并且添加了國際化(比如,使用資源束)、事件傳播、資源加載和透明地創(chuàng)建上下文(比如,通過Servelet容器)等功能。Context模塊也支持Java EE的功能,比如EJB、JMX和遠程調(diào)用等。ApplicationContext接口是Context模塊的焦點。spring-context-support提供了對第三方庫集成到Spring上下文的支持,比如緩存(EhCache, Guava, JCache)、郵件(JavaMail)、調(diào)度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
spring-expression模塊提供了強大的[表達式語言]用于在運行時查詢和操作對象圖。它是JSP2.1規(guī)范中定義的統(tǒng)一表達式語言的擴展,支持set和get屬性值、屬性賦值、方法調(diào)用、訪問數(shù)組集合及索引的內(nèi)容、邏輯算術(shù)運算、命名變量、通過名字從Spring IoC容器檢索對象,還支持列表的投影、選擇以及聚合等。
AOP和檢測(Instrumentation)
spring-aop模塊提供了[面向切面編程](AOP)的實現(xiàn),可以定義諸如方法攔截器和切入點等,從而使實現(xiàn)功能的代碼徹底的解耦出來。使用源碼級的元數(shù)據(jù),可以用類似于.Net屬性的方式合并行為信息到代碼中。
spring-aspects模塊提供了對AspectJ的集成。
spring-instrument模塊提供了對檢測類的支持和用于特定的應(yīng)用服務(wù)器的類加載器的實現(xiàn)。javaagent 的支持和類加載器。spring-instrument-tomcat模塊包含了用于tomcat的Spring檢測代理。
消息處理(messaging)
Spring 4 包含的spring-messaging模塊是從Spring集成項目的關(guān)鍵抽象中提取出來的,這些項目包括Message、MessageChannel、MessageHandler和其它服務(wù)于消息處理的項目。這個模塊也包含一系列的注解用于映射消息到方法,這類似于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)商特定錯誤代碼的解析。
spring-tx模塊支持[編程式事務(wù)和聲明式事務(wù)],可用于實現(xiàn)了特定接口的類和所有的POJO對象。
(譯者注:編程式事務(wù)需要自己寫beginTransaction()、commit()、rollback()等事務(wù)管理方法,聲明式事務(wù)是通過注解或配置由spring自動處理,編程式事務(wù)粒度更細)
spring-orm模塊提供了對流行的[對象關(guān)系映射]API的集成,包括[JPA]、[JDO]和[Hibernate]等。通過此模塊可以讓這些ORM框架和spring的其它功能整合,比如前面提及的事務(wù)管理。
spring-oxm模塊提供了對[OXM]實現(xiàn)的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等。
spring-jms模塊包含生產(chǎn)(produce)和消費(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遠程調(diào)用中與web相關(guān)的部分。
spring-webmvc模塊(即Web-Servlet模塊)為web應(yīng)用提供了模型視圖控制([MVC])和REST Web服務(wù)的實現(xiàn)。Spring的MVC框架可以使領(lǐng)域模型代碼和web表單完全地分離,且可以與Spring框架的其它所有功能進行集成。
spring-webmvc-portlet模塊(即Web-Portlet模塊)提供了用于Portlet環(huán)境的MVC實現(xiàn),并反映了spring-webmvc模塊的功能。
Test
spring-test模塊通過JUnit和TestNG組件支持[單元測試]和[集成測試]。它提供了一致性地[加載]和[緩存]Spring上下文,也提供了用于單獨測試代碼的[模擬對象](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直接導入就可以了,如果沒有g(shù)radle idea會自動下載的

面試場景回顧
- 回顧下之前的面試經(jīng)歷
說下spring IOC
在沒有spring ioc的時候,我們?nèi)绻枰褂靡粋€類的時候,
1.通過new的方式
2.通過另一個類new出來然后傳遞到指定需要的類里面
無論這2個那種方式,都會使我們之前的依賴關(guān)系很混亂,代碼里面到處是new,而且服務(wù)的初始化也很混亂。
有了IOC的容器的話可以使服務(wù)類或者bean,進行一個管理,然后通過聲明注入的方式到指定的類里面,里面用到了xml技術(shù)才可以對我們bean進行定義和解析,這就是反射的技術(shù),才可以把一個bean注入到另一個bean里面,里面也用到了抽象工廠的模式。說實在的就是給程序員節(jié)省時間,說這句是不是無懈可擊。
PS:直擊源碼的學習,springboot和springcloud慢慢主流,很多大型框架的思路都是借鑒了spring,相信讀懂了常用的spring源碼后,以后的路會越走越寬廣。會在后面的博文里面多加入更多自己的心得體會,更加詳細的一起學習spring源碼。