Spring源碼學習之Spring Bean的生命週期以及Spring後置處理器

最近在學習Spring源碼,整理一些學習筆記,希望能夠幫助自己結構化的梳理知識,如果湊巧能幫助到大家,無上榮幸。當然筆記中會有我自己一些理解性的內容,可能出現不全面甚至錯誤的東西,大家甄別後謹慎參考哈。

既然是Spring Bean的生命週期管理先說明下什麼是Spring Bean,他和普通的java類有什麼區別,我的理解是Spring Bean是通過Spring容器在保留我們自己寫的業務代碼原有邏輯的前提下,通過技術手段將類初始化、實例化甚至增強成一個新類的過程,這個過程就是Spring Bean的生命週期。

Spring容器(ApplicationContext)有多種實例化的方式,比如:
ClassPathXmlApplicationContext 從XML中裝配
AnnotationConfigApplicationContext 從註解中裝填
我主要說明AnnotationConfigApplicationContext的實例化過程,Spring在實例化AnnotationConfigApplicationContext對象時,通過Scan方法掃描出所有需要實例化的類,比如添加了@Component註解,源碼如下:
在這裏插入圖片描述
這個refresh方法做了很多事,這裏不展開一一討論,只講後邊需要用到的知識:
1、掃描、解析需要裝配的類
2、初始化BeanDefinition:把1步中掃描到需要裝配的類put到BeanDefinition對象的集合中(Bean的描述對象,其中包含Bean名稱、是否是單例、是否是懶加載等等,你可以理解爲一個Bean可能有什麼屬性,這個對象中就有一個對應的屬性描述它)
3、遍歷3中的set通過反射等JDK提供的技術手段將所有類進行實例化,添加到Spring單例池中供使用

這麼看好像spring很簡單啊,但是SpringNB就NB在上述的過程中,幾乎每一步都是支持程序員人工干預的,照例我們不展開一一的講,拿BeanPostProcessor舉例,我們通過繼承這個類,可以拿到2步中的BeanDefinition,說到這裏,其實大多數人已經知道了,我們既然拿到裏即將初始化類的描述對象,那我們現在對這個對象進行的任何操作,都會被神不知鬼不覺的實例化到Spring的容器中,比如說上邊提到的Bean名稱,你可以把它從Test1改成Test2,這樣你的代碼中本來沒有初始化這個Test2,你莫名其妙的就能用了,而且裏邊的屬性和方法就是原來Test1類中的。
簡單的想通過這個過程你就能理解爲什麼Spring可以實現AOP了,他可以拿到你類中的任何內容並且進行加工後實例化,那是不是我相加什麼就加什麼呢,但是Spring的後置處理器還沒那麼簡單,咱們簡單理解可以認爲有9步,上一個盜來的圖:
在這裏插入圖片描述
這個圖基本能夠說明Spring中後置處理器的執行內容和步驟。

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