(介紹一,能夠略過)Spring強大的擴展能力,促進了其與新技術的融合,維護了它持久的生命力,熟悉Spring是軟件特別是互聯網開發人員的基本功之一,特別是在以Spring Boot爲基礎搭建的微服務大行其道的當下。java
(介紹二,能夠繼續略過)Spring Boot是構建微服務的基礎,它針對Spring較重的開發部署流程進行了簡化,使得上下游不一樣框架的融合、配置開發、部署變得很是簡單,但它的底層核心仍然是Spring。spring
Spring源碼很複雜,網上相關文章也不少(建議對着文章讀源碼,先對總體流程主要是啓動流程有個大致瞭解,而後再細化,以實踐爲導向),在此就其兩大核心IOC和AOP開啓兩個傳送門,感興趣的同窗能夠看一下(文章很長,不適合碎片化閱讀):編程
Spring總體來說是個Bean的管理容器,最主要的核心就是Bean(Bean能夠經過id或name區分 ,也能夠經過class type區分),從XML文件或者註解聲明中將Bean的定義抽象成Beandefinition(Beandefinition的來源多種多樣,除了本身顯示定義的,第三方註解引入的,BeanDefinitionRegistryPostProcessor(如ConfigurationClassPostProcessor)可用於引入Beandefinition),Beandefinition經過Beanfactory管理,Beanfactory做爲Applicationcontext 的內部屬性,不一樣的Applicationcontext 之間有層級關係,在尋找bean的過程當中能夠沿着這種層級關係尋找(在本身內部的Beanfactory找不到的話再向上層父級尋找),而後經過Beandefinition來初始化Bean。微信
初始化過程當中能夠設立不少的擴展點(如初始化以前、以後),具體能夠看BeanPostProcessor等擴展機制 (咱們在開發過程當中也能夠結合自定義註解針對此作一些擴展開發)。框架
IOC的原理就是經過第三方也就是Spring容器將一個Bean注入到另外一個Bean(即依賴注入),經過類型、名稱、構造方法等方式,循環依賴能夠關注一下。異步
AOP的原理就是在上文描述的擴展點(即beanpostprocessor的擴展點)經過動態代理(jdk dynamic proxy和cglib要重點了解)將一個Bean轉換成動態代理Bean,而動態代理Bean就能夠在本來Bean的執行代碼先後加入一些本身的擴展(Spring caching和Transaction都是基於此實現的)。微服務
Spring Boot和傳統Spring開發一個顯著的不一樣就是大量的註解,註解是什麼呢,就是用來描述類、字段、方法的元數據,有些可能在編譯以前就被去掉了,有些會被編譯進class文件,註解自己是沒有什麼做用的,可是在Bean處理過程當中根據這些元數據作一些特殊處理,就使得註解的做用威力無窮了。oop
Spring Boot的Autoconfiguration機制方便了與其餘框架的融合,能夠看我以前的一篇文章(Spring Boot之零),經過掃描classpath下面的spring.factory文件,能夠方便的將擴展類添加到Bean definition中去,針對Bean definition的擴展,能夠看幾個很重要的註解:configuration、import及與其有關的*ConfigurationSelector,擴展方式很是靈活,但目的只有一個,就是將相關的Bean definition加入到Beanfactory中去。
其餘框架整合進Spring的時候通常繞不過這幾點,經過註解將相關Bean import進去,或者在原有Bean的基礎上加一些本身的邏輯返回代理Bean,而Bean也能夠獲取Application的各類事件觸發,從而構建起強大的功能。
在看一個Spring 相關框架的過程當中,經過注意這幾點內容,我以爲仍是比較快的:
一、看框架的總體描述,拿到開關注解(如Enable*),看import進了哪些關鍵Bean,特別是注意跟擴展點有關的Bean,這些Bean每每會根據註解來作一些特殊處理;
二、看框架的總體功能,關心同/異步和長/短鏈接以及push/pull,針對功能作一些關鍵點搜索,找到關鍵實現;
三、根據關鍵實現再用intellij神器作反向追溯,快速理通整個流程或者找到測試類(如*Test),經過測試類Debug代碼;
四、對於影響性能的關鍵技術實現,就要去摳細節了,主要和Threadlocal(保存請求上下文變量)、緩存、鏈接池、線程池、異步非阻塞、減小運行時反射處理等有關。
經過以上的幾點,我快速理清了Spring Cloud技術棧(zuul/eureka/feign/ribbon/apollo)的源碼大致處理流程,不過Spring Cloud中熔斷器Hystrix大量使用了響應式編程(Rxjava),這個仍是比較繞的,建議先看簡單的例子,琢磨清楚了subscriber是如何向上傳遞的以及結果集是如何向下發射的,再加上subscribeon和observeon線程池對於數據傳遞的影響,再去看就比較容易了。
對於Rxjava再加上一個傳送門:Rxjava