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

spring從07年接觸到目前2018年也差很少10年了,一個java的框架爲何能火這麼多年。不少人對spring的使用輕車熟路,可是從未解讀過spring的源碼,老鐵跟我一塊兒看看源碼,瞭解下內部的構造,只有源碼讀過的人才能得到上乘武功,軟件開發不僅是搬磚的老鐵。內功熟悉原理,外功是靈活使用。內功比如電力,外功比如電機。內功的電力越強,電機的馬力越大才能發揮巨大做用,相反若是電力弱,馬力在強也是不行的。spring從單一的jar包,發展到如今十多個jar包,spring mvc 到spring boot 到spring cloud,從須要配置到如今0配置,封裝的愈來愈厲害,致使的結果,若是不瞭解內核在強的馬力,遇到問題可能無從下手。一塊兒熟讀spring源碼尤其重要。java

spring

####歷史mysql

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

從我開始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.3git

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

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

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。web

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範圍)。spring

在Rod領導下管理Spring項目的Interface21公司於2007年11月改名爲SpringSource。同時發佈了Spring 2.5。Spring 2.5中的主要新功能包括支持Java 6/Java EE 5,支持註釋配置,classpath中的組件自動檢測和兼容OSGi的bundle。sql

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性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
相關文章
相關標籤/搜索