相信我,你會收藏這篇文章的
本篇文章是這段時間擼出來的Spring源碼解析系列文章的匯總,總共包含以下專題。喜歡的同學可以收藏起來以備不時之需
- 本篇文章搭建了IOC源碼解析的demo環境,啟動這個環境即可開啟閱讀Spring源碼的第一步
- 開始源碼閱讀時介紹了Spring容器中最經典的容器
ClassPathXmlApplicationContext
,這個容器是我們在學習Spring的時候最先接觸的一個容器,它負責加載當前環境下的xml配置文件 - 緊接着介紹了bean工廠
BeanFactory
以及容器中bean的包裝類BeanDefinition
- 然后就是Spring對xml配置文件的加載和解析
- 當解析的
beans
標簽中各個bean
中時將會把這個東東使用BeanDefinition
包裝后注冊到容器中 - 當
bean
注冊完成后會有一些Spring對BeanFactory
的擴展點的處理 - 當然除了擴展點還有國際化、監聽器等操作
- 開篇先介紹了
conversionService
和EmbeddedValueResolver
兩個比較有意思的東東 - 然后就是重點的
bean
的初始化 - 初始化過程中涉及到了
singleton
和prototype
兩個Scope的bean
的處理 - 當然,還有令人頭疼的循環依賴問題
- 創建bean的過程中還有我們熟悉的
@Autowired
注解注入屬性的方式 - 接着就是一些清除緩存的操作
SpringIOC源碼解析(基於注解)
閱讀本篇文章之前建議您首先查看上方兩篇文章,因為本篇主要是描述了基於注解的方式和基於xml配置文件方式的異同點
- 源碼閱讀環境的搭建
- 首先簡單描述了
bean
容器AnnotationConfigApplicationContext
- 然后源碼執行的第一步就是關於包掃描一塊的東西,也就是我們比較熟悉的注解
@ComponentScan
- 掃描到了各個帶有注解的類之后就是讀取類呀、反射呀什么的來加載類
- 當
bean
已經加載完后就是bean
的注冊邏輯了
相比較與之前兩篇文章的長篇大論,這篇文章的篇幅要少很多,這主要得益於Spring的設計精妙和代碼之優雅
- 源碼閱讀環境的搭建
@EnableAspectJAutoProxy
注解的原理@EnableAspectJAutoProxy
注解又使用到了@Import
注解,關於@Import
注解的文章下面有地址
- 首先提到了SpringAOP是基於
postProcessBeforeInstantiation
和postProcessAfterInstantiation
兩個方法實現的,這篇文章主講postProcessBeforeInstantiation
- 加載增強
- 獲取所有的增強又對增強進行了一系列的封裝
- 以
postProcessAfterInstantiation
開篇 - 所有的bean在初始化之后都會調用這個方法
- 在這里獲取到之前加載到的所有的增強,和類的所有方法一一匹配
- 當類具有匹配增強的時候就可以為這個類生成具體的代理了
- 傳統JDBC的使用
- 源碼閱讀環境的搭建
- 使用JdbcTemplate以update方法切入
- 獲取連接加載驅動等方法的封裝
- 請求參數的封裝
- 調用驅動提供的方法
- query方法的分析,與update僅有返回結果的處理不同其他完全相同
- 三種使用方式
- 加載時機
- 對不同使用方式的處理方式
- 源碼閱讀環境的搭建
@EnableTransactionManagement
注解的原理解析
Spring事務源碼解析(二)獲取增強
讀到這里的朋友希望您最好對AOP的源碼有一定的了解
- 增強的獲取
@Transactional
注解屬性的解析
- 創建事務信息(包含事務隔離級別的處理等)
- 調用執行鏈
- 異常回滾
- 清除事務信息
- 提交事務
- 源碼閱讀環境的搭建
- SpringBoot中SpringMVC自動配置原理
DispatcherServlet
的初始化邏輯- web容器的初始化
- 獲取對應的handler
- 獲取對應的handlerAdapter
- 調用handle
- 執行攔截器
- 處理返回結果
源碼閱讀環境
您可能注意到上方文章中包含了很多源碼閱讀環境的搭建,當真正自己要去閱讀時搭建起來還是比較浪費時間的。所以我把這些工作都替您做好了,您可以直接訪問下方鏈接獲取
https://github.com/shiyujun/spring-framework
后續規划
- Spring常用擴展點的應用場景
- SpringBoot源碼解析
- SpringCloud常用組件源碼解析
- MyBatis、druid源碼解析
- 阿里開源Nacos、Sentinel、Seata源碼解析
- K8S、Istio源碼解析
- 等等
交流群
為了方便大家的交流學習,特意搞了個技術交流群,有興趣的同學可以掃描下方二維碼進群。如二維碼過期可在公眾號添加小編的微信發送暗號進群