天天看點

每日八股,今天聊聊spring工程的啟動流程。。

作者:IT楠老師

每日八股,今天應粉絲要求聊一聊spring的啟動流程。spring的整個啟動流程定義在abstract ApplicationContext,這個抽象類當中的refresh方法,這是一個典型的模闆方法設計模式。在這個方法當中定義了啟動或者是重新整理容器的整個骨幹方法流程。

在這個方法或者在這個類當中實作了整個啟動的核心邏輯,并且給子類預留了很多的空方法,由子類獨立完成,同時還給第三方的應用程式留出了足夠的可擴充性的擴充點。這個慢慢的給大家一點一點講清楚。

首先要了解spring的整個啟動流程,一定要了解application context這個大而全的核心接口,它所擁有的衆多的能力。因為整個啟動都是在圍繞application context,也就是spring上下文而進行的。

每日八股,今天聊聊spring工程的啟動流程。。

如果學過我spring源碼課程的同學你一定知道,我們的ApplicationContext的接口是一個大而全的,擁有衆多能力的接口。它實作了LisableBeanfactory和hiericalalBeanFactory,讓它擁有了并工廠的可枚舉和分層的能力。

說人話就是什麼有getBean的能力和分層做父子容器的能力。它實作了EnvironmentStudioble接口,讓它擁有了管理上下文環境變量的能力,實作了EventCus,讓它擁有了事件釋出的能力,實作了ResourceResover,讓它擁有了檔案資源加載的能力,實作了MessageResource,讓它擁有了國際化的能力。

每日八股,今天聊聊spring工程的啟動流程。。

還有啥我想想有點記不住了,沒想起來不用管它了。但是從這幾個接口當中,可以抽離出幾個核心的點。第一個就是Bean工廠,第二個就是事件釋出,第三個就是國際化。是以能看到在整個spring的啟動流程當中,都是在圍繞Bean工廠的建立以及這些附加功能而産生的。

回到refresh方法當中逐個去看一看。因為這個課程我已經講過很多遍了,是以大概的流程我是能記住的,但對于你們來說,還是最好對照着代碼看一看,我覺得效果會更好。

每日八股,今天聊聊spring工程的啟動流程。。

當然不看也沒事,你南哥盡可能給你講清楚。首先要啟動spring工程。

·第一步要幹的事情就是準備一個Bean工廠,這個準備可能是複用之前的Bean工廠,也有可能是建立一個新的Bean工廠,我們要看此類是怎麼實作的。

·緊接着有了Bean工廠之後,我們需要對Bean工廠做些配置,配置不外乎就是讓Bean工廠在以後初始化Bean的時候忽略掉哪些Bean對不對?忽略到實作了哪些接口的Bean優先加載實作了哪些接口的Bean,僅此而已。事實上到此為止,我們的并工廠就差不多了,但是spring作為一個基礎架構,留給子類和第三方應用程式。

每日八股,今天聊聊spring工程的啟動流程。。

很多擴充點,是以并工廠一旦被建立成功,它一定會留下一些口子,讓子類去什麼?對這個并工廠做一些額外的處理,讓第三方應用程式可以對這個并工廠做一些額外的處理,于是它提供了一個postProcessbeanfactory這樣的空方法,由此類去獨立進行擴充它。

提供了咱們的BeanfactoryPost Processon接口:這種什麼Bean工廠的後置處理器,讓第三方或者是子類去進行一些獨立的擴充,這都是擴充點。

·當Bean工廠被建立好之後,我們會給Bean工廠裡邊去放入一些BeanPostProcessor。在建立Bean之前,一定要把這些Bean的後置處理器放進去,這樣在建立并的時候才可以主動的去攔截這些BeanPostProcessor。作為Bean的後置處理器,一定要優先于Bean被放到容器當中,這樣以後你在加載Bean的時候才能夠攔截Bean,并且做相關的處理。

每日八股,今天聊聊spring工程的啟動流程。。

如果你實在不知道什麼是後置處理器,希望花一點點時間去學習一下,到目前為止并工廠已經OK了,而且它的并的後置處理器也已經OK了。接下來就要為它做一些基礎能力的賦能,比如說初始化messageSource,實作國際化的能力;初始化的多波器,形成釋出事件的能力,并且查詢所有的監聽者Q7,并且把這些東西注冊到容器當中。

每日八股,今天聊聊spring工程的啟動流程。。

接下來你又能看到一個空方法,這個方法沒有任何的實作叫onRefresh,也是留給子類進行獨立擴充的。比如這個方法在springboot工程當中,它的實作是啟動一個WebSe→r,也就是TomcatOK,到目前為止基礎工作已經全部做完。

那麼接下來就由容器去初始化所有的單立Bean。這個方法是整個refresh方法當中最複雜、最耗時也是最重要的工作,這個裡邊不再詳細做介紹。當所有的病被初始化完成之後,容器也啟動的差不多了,最後會進入一個方法叫非finishRefresh方法。

每日八股,今天聊聊spring工程的啟動流程。。

在這個方法裡邊會做清理緩存、釋出已經重新整理成功的事件等相關的工作。如果在啟動的過程當中發生了異常會進入到catch語句當中會執行銷毀,所有的Bean執行Bean的Bit方法,同時會把容器進行關閉。

到此為止,整個spring的啟動流程就給大家講完了。如果大家覺得有收獲,請在評論區裡邊回複666,同時給南哥點個關注。有實力的大哥可以去楠哥的櫥窗裡邊拍一兩單,支援一下你楠哥,我也是非常開心的。