今天介紹一下你們常見的一個單詞 context 應該怎麼去理解,正確的理解它有助於咱們學習 spring 以及計算機系統中的其餘知識。算法
咱們常常在編程中見到 context 這個單詞,固然每一個人有每一個人的理解,它被理解爲:上下文、容器等等。我想說的是,context 理解爲上下文最爲合適。爲何呢?我以一個在計算機系統的例子來解釋一下。spring
在計算機系統中,進程執行時有進程上下文,若是進程在執行的過程當中遇到了中斷,CPU 會從用戶態切換爲內核態(固然這個過程用戶進程是感知不到的,由硬件來實現的),此時進程處於的進程上下文會被切換到中斷上下文中,從而能夠根據中斷號去執行相應的中斷程序。編程
經過上面這個例子咱們能夠發現,進程在執行程序(無論是用戶程序,仍是內核中的中斷程序)時,都會依賴一個上下文,這個上下文由多種數據結構組成,能夠提供咱們運行時須要的一些數據和保存運行時的一些數據。那其實 context 就能夠理解對一個程序運行時所須要的一些數據結構的抽象表達唄。後端
抽象是個好東西,能夠更方便的表達一些東西,更好的設計系統,但你們要想進步也不能停留在抽象層面,要去探索它的真正含義,真正對應的實體。有時間和你們聊一聊抽象應該怎麼去理解。微信
回到 spring 中,spring 的 ioc 容器也是程序呀,那它的執行也確定須要依賴一個上下文。因此你們應該理解 spring context 的意思了吧。那 spring context 既然是 spring 的上下文,按照咱們上面的說法上下文會對應數據結構,那 spring context 的數據結構是什麼呢?換句話說,spring context 究竟包括什麼?接下來我就把這個抽象的概念給你們對應到實打實的數據結構上。數據結構
主要包括:學習
下面你們能夠結合代碼這段代碼去理解 spring context 的生命週期。spa
public static void main(String[] args) {
// 初始化和啓動
AnnotationConfigApplicationContext acaContext = new AnnotationConfigApplicationContext(AppConfig.class);
// 運行
acaContext.getBean(ServiceA.class);
// 關閉/銷燬
acaContext.close();
}複製代碼
咱們平時常說的spring 啓動其實就是調用 AbstractApplicationContext#refresh 完成 spring context 的初始化和啓動過程。spring context 初始化從開始到最後結束以及啓動,這整個過程都在 refresh 這個方法中。refresh 方法剛開始作的是一些 spring context 的準備工做,也就是 spring context 的初始化,好比:建立 BeanFactory、註冊 BeanFactoryPostProcessor 等,只有等這些準備工做作好之後纔去開始 spring context 的啓動。操作系統
與現實生活聯繫一下,你能夠把初始化理解爲準備原料(對應到編程中就是建立好一些數據結構,併爲這些數據結構填充點數據進去),等準備了你才能去真正造玩偶、造東西呀(對應到編程中就是執行算法)。在編程中數據結構與算法是分不開的也是這個道理呀,它們相互依賴並無嚴格的界限劃分。設計
spring context 啓動後能夠提供它的服務的這段時間。
不須要用 spring context ,關閉它時,其實對應到代碼上就是 acaContext.close();
最近又去研究了一遍 spring 源碼以及一些操做系統知識的複習,忽然有感而發,寫下這篇文章。若是你們想學習 spring 源碼和操做系統的話,能夠下面留言,我之後會出一系列相關的文章。搜索微信公衆號:Java知其因此然,可免費領取某課、Java 後端面經等資源,還有統一環境(教你怎麼配置一套開發環境)視頻領取。