1. 程式人生 > >『互聯網架構』軟件架構-spring源碼之spring結構概述

『互聯網架構』軟件架構-spring源碼之spring結構概述

特性 場景 屬性 clone RKE 信息 處理 類加載器 3.6

spring從07年接觸到目前2018年也差不多10年了,一個java的框架為什麽能火這麽多年。很多人對spring的使用輕車熟路,但是從未解讀過spring的源碼,老鐵跟我一起看看源碼,了解下內部的構造,只有源碼讀過的人才能獲得上乘武功,軟件開發不只是搬磚的老鐵。內功熟悉原理,外功是靈活使用。內功好比電力,外功好比電機。內功的電力越強,電機的馬力越大才能發揮巨大作用,相反如果電力弱,馬力在強也是不行的。spring從單一的jar包,發展到現在十多個jar包,spring mvc 到spring boot 到spring cloud,從需要配置到現在0配置,封裝的越來越厲害,導致的結果,如果不了解內核在強的馬力,遇到問題可能無從下手。一起熟讀spring源碼尤為重要。
技術分享圖片

spring
####歷史

官網:https://github.com/spring-projects/spring-framework

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

技術分享圖片

2002年開發者Juergen Hoeller和Yann Caroff說服Rod Johnson創建一個基於基礎結構代碼的開源項目。Rod,Juergen和Yann於2003年2月左右開始合作該項目。Yan為新框架創造了“Spring”的名字。據Rod介紹,Spring是傳統J2EE的“冬天”之後的新開始!

Rod Johnson的書以非常詳盡,詳實和實用的方式介紹了J2EE最佳實踐的世界。從編碼標準,idioms,單元測試,設計決策,持久性,緩存,EJB,model-2表示層,視圖,驗證技術到性能的公平批評,讀者都可以體會從理論到實踐,制約因素,風險以及最佳做法。本書確實是一個知識庫。

2003年6月,Spring 0.9在Apache 2.0許可下發布。2004年3月,1.0版發布。有趣的是,即使在1.0發布之前,spring也被開發人員廣泛采用。2004年8月,Rod Johnson,Juergen Hoeller,Keith Donald和Colin Sampaleanu共同創立了一家專註於Spring咨詢,培訓和支持的公司interface21。

Yann Caroff在早期離開了團隊。Rod Johnson在2012年離開了團隊。Juergen Hoeller仍然是Spring開發團隊的積極成員。

自2004年1.0版本發布以來,Spring框架迅速發展。Spring 2.0於2006年10月發布,到那時,Spring的下載量超過了100萬。Spring 2.0具有可擴展的XML配置功能,用於簡化XML配置,支持Java 5,額外的IoC容器擴展,支持動態語言(如groovy,aop增強功能和新的bean範圍)。

在Rod領導下管理Spring項目的Interface21公司於2007年11月更名為SpringSource。同時發布了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在幾周內收購了cloud foundry,這是一家雲PaaS提供商。2015年,cloud foundry轉移到了非營利cloud foundry基金會。

2009年12月,Spring 3.0發布。Spring 3.0具有許多重要特性,如重組模塊系統,支持Spring表達式語言,基於Java的bean配置(JavaConfig),支持嵌入式數據庫(如HSQL,H2和Derby),模型驗證/ REST支持和對Java EE 6的支持。

2011年和2012年發布了許多3.x系列的小版本。2012年7月,Rod Johnson離開了團隊。2013年4月,VMware和EMC通過GE投資創建了一家名為Pivotal的合資企業。所有的6應用項目都轉移到了Pivotal。

2013年12月,Pivotal宣布發布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年期間發布了許多Spring框架4.x.x版本。當前的Spring框架版本(4.3.7)於2017年3月發布。Spring框架4.3.8於2017年4月發布,並將成為4.x系列中的最後一個。Spring框架的下一個延續的主要版本是在5.0版本展開。

技術分享圖片

####架構

技術分享圖片

每個模塊的功能如下:

核心容器(Core Container)
核心容器包括 spring-core , spring-beans , spring-context , spring-context-support和 spring-expression (SpEL,Spring表達式語言,Spring Expression Language)等模塊。

spring-core和 spring-beans 模塊是[Spring框架的基礎],包括控制反轉和依賴註入等功能。BeanFactory是工廠模式的微妙實現,它移除了編碼式單例的需要,並且可以把配置和依賴從實際編碼邏輯中解耦。

[Context]( spring-context )模塊是在[Core和Bean]模塊的基礎上建立起來的,它以一種類似於JNDI註冊的方式訪問對象。Context模塊繼承自Bean模塊,並且添加了國際化(比如,使用資源束)、事件傳播、資源加載和透明地創建上下文(比如,通過Servelet容器)等功能。Context模塊也支持Java EE的功能,比如EJB、JMX和遠程調用等。 ApplicationContext 接口是Context模塊的焦點。 spring-context-support 提供了對第三方庫集成到Spring上下文的支持,比如緩存(EhCache, Guava, JCache)、郵件(JavaMail)、調度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。

spring-expression模塊提供了強大的[表達式語言]用於在運行時查詢和操作對象圖。它是JSP2.1規範中定義的統一表達式語言的擴展,支持set和get屬性值、屬性賦值、方法調用、訪問數組集合及索引的內容、邏輯算術運算、命名變量、通過名字從Spring IoC容器檢索對象,還支持列表的投影、選擇以及聚合等。

AOP和檢測(Instrumentation)

spring-aop模塊提供了[面向切面編程](AOP)的實現,可以定義諸如方法攔截器和切入點等,從而使實現功能的代碼徹底的解耦出來。使用源碼級的元數據,可以用類似於.Net屬性的方式合並行為信息到代碼中。

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

spring-instrument模塊提供了對檢測類的支持和用於特定的應用服務器的類加載器的實現。javaagent 的支持和類加載器。 spring-instrument-tomcat 模塊包含了用於tomcat的Spring檢測代理。

消息處理(messaging)

Spring 4 包含的 spring-messaging 模塊是從Spring集成項目的關鍵抽象中提取出來的,這些項目包括 Message 、 MessageChannel 、 MessageHandler 和其它服務於消息處理的項目。這個模塊也包含一系列的註解用於映射消息到方法,這類似於Spring MVC基於編碼模型的註解。

數據訪問與集成

數據訪問與集成層包含JDBC、ORM、OXM、JMS和事務模塊。

(譯者註:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)

spring-jdbc模塊提供了[JDBC]抽象層,它消除了冗長的JDBC編碼和對 數據庫 供應商特定錯誤代碼的解析。

spring-tx模塊支持[編程式事務和聲明式事務],可用於實現了特定接口的類和所有的POJO對象。

(譯者註:編程式事務需要自己寫beginTransaction()、commit()、rollback()等事務管理方法,聲明式事務是通過註解或配置由spring自動處理,編程式事務粒度更細)

spring-orm模塊提供了對流行的[對象關系映射]API的集成,包括[JPA]、[JDO]和[Hibernate]等。通過此模塊可以讓這些ORM框架和spring的其它功能整合,比如前面提及的事務管理。

spring-oxm模塊提供了對[OXM]實現的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等。

spring-jms模塊包含生產(produce)和消費(consume)消息的功能。從Spring 4.1開始,集成了 spring-messaging 模塊。

Web

Web層包括 spring-web 、 spring-webmvc 、 spring-websocket 、 spring-webmvc-portlet 等模塊。

spring-web模塊提供面向web的基本功能和面向web的應用上下文,比如多部分(multipart)文件上傳功能、使用Servlet監聽器初始化IoC容器等。它還包括HTTP客戶端以及Spring遠程調用中與web相關的部分。

spring-webmvc模塊(即Web-Servlet模塊)為web應用提供了模型視圖控制([MVC])和REST Web服務的實現。Spring的MVC框架可以使領域模型代碼和web表單完全地分離,且可以與Spring框架的其它所有功能進行集成。

spring-webmvc-portlet模塊(即Web-Portlet模塊)提供了用於Portlet環境的MVC實現,並反映了 spring-webmvc 模塊的功能。

Test

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

下載spring fremwork 源碼

配置加速功能Windows環境

C:\Windows\System32\drivers\etc\hosts
最末尾添加兩句話:

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

192.30.253.112 http://github.com

技術分享圖片

配置加速功能,linux環境

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
#切換到對應分支
git checkout -b v4.3.8 v4.3.8.RELEASE
技術分享圖片

idea直接導入就可以了,如果沒有gradle idea會自動下載的

技術分享圖片

面試場景回顧
回顧下之前的面試經歷

說下spring IOC

在沒有spring ioc的時候,我們如果需要使用一個類的時候,

1.通過new的方式

2.通過另一個類new出來然後傳遞到指定需要的類裏面

無論這2個那種方式,都會使我們之前的依賴關系很混亂,代碼裏面到處是new,而且服務的初始化也很混亂。

有了IOC的容器的話可以使服務類或者bean,進行一個管理,然後通過聲明註入的方式到指定的類裏面,裏面用到了xml技術才可以對我們bean進行定義和解析,這就是反射的技術,才可以把一個bean註入到另一個bean裏面,裏面也用到了抽象工廠的模式。說實在的就是給程序員節省時間,說這句是不是無懈可擊。

PS:直擊源碼的學習,springboot和springcloud慢慢主流,很多大型框架的思路都是借鑒了spring,相信讀懂了常用的spring源碼後,以後的路會越走越寬廣。會在後面的博文裏面多加入更多自己的心得體會,更加詳細的一起學習spring源碼。

在此我向大家推薦一個架構學習群。交流學習群號:948368769 加群獲得以上學習視頻,群裏面還會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高並發、高性能、分布式、微服務架構的原理,JVM性能優化、分布式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

『互聯網架構』軟件架構-spring源碼之spring結構概述