Spring IOC 源碼學習一 基本姿勢

以下是個人私貨, 請讀者謹慎參考。
作為一個過來人, 沒有方式方法學習 Spring 源碼枯燥無味的,建議你:

  1. 熟悉常見的Spring關鍵接口:Spring 框架龐大而複雜,擴展點非常多,建議先了解學習 Spring 常見外圍的擴展功能點(比如 在Spring中對於@PostConstruct and @PreDestroy的註解就是通過 BeanPostProcessor接口實現的),再逐漸靠近核心代碼時有種“哦,原來是這裏調用的感覺就對了” 也能夠把框架功能整體串起來加深記憶。
  2. 概念性問題:IOC 是 Spring 框架成立基礎,你需要對這個核心概念有所明確,也不復雜。
容器的基本加載流程:跟蹤源碼時心中需要有個主體流程,避免對一些細枝末節,不重要的點反覆調試。避免浪費生命,高效學習。

1. Spring IOC 源碼關鍵的接口

  • [Spring BeanFactory 接口] - 用於獲取、創建和存放bean 的工廠 (工廠模式)。
  • [Spring BeanDefinition 接口] - Bean 定義的元數據對象, 可以理解為一個bean 對應一個 BeanDefinition 的描述。
  • [Spring BeanFactoryPostProcessor 接口] - Spring 預留的擴展點, 在 BeanFactory 加載完所有的 BeanDefinition 但是尚未實例化任何Bean時調用,設計主要目的是對 BeanDefinition 進行擴展。
  • [Spring BeanPostProcessor 接口] - Spring 預留的擴展點,會在Bean實例化 -> 填充屬性 -> 調用Aware 後 回調的擴展點, 設計的主要目的是針對Bean的實例進行擴展。
  • [Spring Aware 接口] - Spring 給Bean 感知/獲取到 Spring 容器內部組件的回調接口, 例如: 實現 ApplicationContextAware 接口Spring 會給你注入 '容器對象', 實現 EnvironmentAware 接口Spring 會給你注入 '環境對象' 可獲取環境變量等.
  • [Spring 中的Event機制] - Spring 內置的事件訂閲、通知機制,可以監聽Spring 容器內部的啓動、刷新等事件,也可以擴展自定義事件,實現框架系統的解耦 (觀察者模式)。

2. 概念性的問題

什麼是控制反轉(Inversion of Control)

IOC,即控制反轉(Inversion of Control),是軟件設計中的一種原則,它指的是將控制權從應用程序代碼中轉移至框架或容器。在傳統的程序設計中,應用程序負責創建和管理對象之間的依賴關係,而在 IOC 中,控制權被反轉,由容器負責管理對象之間的依賴關係。

好萊塢有句名言:“Don‘t call us, we’ll call you.”(不要打電話給我們,我們會打給你)。這就是 IoC 的精髓。你(程序員)不要主動去創建和管理你的依賴,等框架(導演)來調用你,並把需要的“道具”(依賴)給你。

什麼是依賴注入(Dependency Injection)

在實踐中,IOC 主要通過依賴注入(Dependency Injection)來實現。依賴注入是IOC的一種實現方式,它指的是將對象所依賴的其他對象(依賴項)注入到該對象中,而不是由對象自己創建或查找依賴項。這樣做的好處是降低了對象之間的耦合度,使得代碼更易於維護、測試和擴展。

in short: IOC 是一個設計概念或原則, 在實踐中,IOC 主要通過依賴注入(Dependency Injection)來實現** **

3.Spring IOC 容器的基本加載流程

以加載讀取 xml 的 org.springframework.context.support.ClassPathXmlApplicationContext 為例:

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

上圖

spring源碼學習之IOC實現原理(一) - 熱心市民王先生的個人空間 -_依賴注入