《系列二》-- 11、Aware是什麼

目錄

閱讀之前要注意的東西:本文就是主打流水賬式的源碼閱讀,主導的是一個參考,主要內容需要看官自己去源碼中驗證。全系列文章基於 spring 源碼 5.x 版本。

寫在開始前的話:

閱讀spring 源碼實在是一件龐大的工作,不說全部內容,單就最基本核心部分包含的東西就需要很長時間去消化了:

  • beans
  • core
  • context

實際上我在博客裏貼出來的還只是一部分內容,更多的內容,我放在了個人,fork自 spring 官方源碼倉了; 而且對源碼的學習,必須是要跟着實際代碼層層遞進的,不然只是乾巴巴的文字味同嚼蠟。

https://gitee.com/bokerr/spring-framework-5.0.x-study

這個倉設置的公共倉,可以直接拉取。



Spring源碼閱讀系列--全局目錄.md



正文

有這麼一個例子:
在 BeanFactory.getBean() 流程中,創建 bean 時,有一個步驟叫做:初始化,其中包含如下的邏輯:

initializeBean().invokeAwareMethods()

    private void invokeAwareMethods(String beanName, Object bean) {
		if (bean instanceof Aware) {
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean).setBeanName(beanName);
			}
			if (bean instanceof BeanClassLoaderAware) {
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);  // 類加載器 
				}
			}
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

Aware 直譯爲:知道,沒啥實際意義。

我更喜歡把它叫做裝配器。

結合上邊的代碼,可以樣理解, 某個bean '想要'知道某某信息, 例如:

  • 想知道:spring容器解析到的 beanName, 那麼就需要實現接口 BeanNameAware
  • 想知道:spring 容易應用的 類加載器,需要實現接口 BeanClassLoaderAware
  • 想要知道自己被哪個,BeanFactory 所加載,需要實現接口 BeanFactoryAware

那麼,想 '知道' 這些信息的bean, 就需要實現對應的接口。

其實裝配器Aware 和 後置處理器 PostProcessor 是有相似性的;spring 容器在自己的聲明週期總,規定了他們觸發的時機。
我們作爲spring的用戶,想要藉助這些功能增強自己的代碼,那麼就必須徹底搞懂它,然後在合適的地方覆寫相關的方法即可。

實際上,在開發工作中,也偶有所見,通過覆蓋某個 Aware接口方法來實現用戶自己的個性化配置的情形。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章