(介紹一,可以略過)Spring強大的擴充套件能力,促進了其與新技術的融合,維護了它持久的生命力,熟悉Spring是軟體特別是網際網路開發人員的基本功之一,特別是在以Spring Boot為基礎搭建的微服務大行其道的當下。
(介紹二,可以繼續略過)Spring Boot是構建微服務的基礎,它針對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處理過程中根據這些後設資料做一些特殊處理,就使得註解的作用威力無窮了。
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 相關框架的過程中,通過注意這幾點內容,我覺得還是比較快的:
1、看框架的整體描述,拿到開關注解(如Enable*),看import進了哪些關鍵Bean,特別是注意跟擴充套件點有關的Bean,這些Bean往往會根據註解來做一些特殊處理;
2、看框架的整體功能,關心同/非同步和長/短連線以及push/pull,針對功能做一些關鍵點搜尋,找到關鍵實現;
3、根據關鍵實現再用intellij神器做反向追溯,快速理通整個流程或者找到測試類(如*Test),通過測試類Debug程式碼;
4、對於影響效能的關鍵技術實現,就要去摳細節了,主要和Threadlocal(儲存請求上下文變數)、快取、連線池、執行緒池、非同步非阻塞、減少執行時反射處理等有關。
通過以上的幾點,我快速理清了Spring Cloud技術棧(zuul/eureka/feign/ribbon/apollo)的原始碼大體處理流程,不過Spring Cloud中熔斷器Hystrix大量使用了響應式程式設計(Rxjava),這個還是比較繞的,建議先看簡單的例子,琢磨清楚了subscriber是如何向上傳遞的以及結果集是如何向下發射的,再加上subscribeon和observeon執行緒池對於資料傳遞的影響,再去看就比較容易了。
對於Rxjava再加上一個傳送門:Rxjava