首先,對於乙個web應用
,其部署在web容器(tomcat)
中,web容器提供其乙個全域性的上下文環境
,這個上下文就是servletcontext
,其為後面的spring ioc容器提供宿主環境
;
spring容器啟動流程
定位在spring中,使用統一的資源表現方式resource,定位到spring配置檔案。
載入在載入這個過程中,主要工作是讀取spring配置檔案
,解析配置檔案中的內容
,將這些資訊轉換成為spring內容可以理解、使用的beandefinition
。
註冊載入過配置檔案後,就將beandefinition
資訊註冊到beandefinitionregistry介面
中,通常情況下spring容器
的實現類都實現這個介面。註冊
其實就是把beanname
和beandefinition
作為鍵值對放到beanfactory物件的map
。
(定位)spring容器對應的bean定義
的配置由web.xml中的context-param
標籤指定;
(載入)spring在初始化容器時
,會先解析和載入
所有的bean class
,如果符合要求則通過class生成beandefinition;
(註冊)在載入完所有bean class後
,存入beanfactory中
,開始有序的通過beandefinition例項化bean
。註冊
其實就是把beanname
和beandefinition
作為鍵值對
放到beanfactory物件的map
。
配置類
可以是spring容器的起始配置類
,也可以是通過@componentscan掃瞄得到的類
,也可以是通過@import引入的類
。如果這個類上含有
@configuration,@component,@componentscan,@import,@importresource註解中的乙個,或者內部含有
@bean標識的方法,那麼這個類就是乙個配置類
,spring就會按照一定流程去解析這個類上的資訊。
在解析的第一步會校驗當前類是否已經被解析過
了
在1,3,4,6中都有遞迴操作,也就是在解析乙個bean class a時
,發現其上能夠獲取到其他bean class b資訊
,此時會遞迴的解析bean class b,在解析完bean class b後再接著解析bean class a,可能在解析b時能夠獲取到c,那麼也會先解析c再解析b,就這樣不斷的遞迴解析
。
在第3步中,通過@componentscan掃瞄
直接得到的bean class會被立即加載入beandefinitionnames
中,但@import和@bean形式定義的bean class則不會,也就是說正常情況下面@componentscan直接得到的bean其實例化時機比其他兩種形式的要早。
通過@bean和@import形式定義的bean class不會立即載入
,他們會被放入乙個configurationclass類中
,然後按照解析的順序有序排列,就是上的 「將配置類有序排列」。乙個configurationclass代表乙個配置類,這個類可能是被@componentscan掃瞄到的,則此類已經被載入過了;也可能是被@import引入的,則此類還未被載入;此類中可能含有@bean標識的方法。
spring在解析完了所有bean class後
,開始載入configurationclass
。如果這個configurationclass是被import的,也就是說在載入@componentscan時其未被載入,那麼此時載入
configurationclass代表的bean class。然後載入
configurationclass內的@bean方法
。
順序總結:@componentscan > @import > @bean
ARM Linux啟動過程分析
5 呼叫 linux核心映像 bootloader完成的最後一項工作便是呼叫 linux核心。如果 linux 核心存放在 flash 中,並且可直接在上面執行 這裡的 flash 指 nor flash 那麼可直接跳轉到核心中去執行。但由於在 flash 中執行 會有種種限制,而且速度也遠不及 r...
Linux啟動過程分析
boot loader 當cpu一上電,此時cpu必須從nor flash或者nand flash中取指令 直接從 nand flash取指令的ap為支援nand 啟動 nand boot 其實原理就是ap 內部的rom裡有一小段 包括nand flash驅動,它啟動從nand flash中讀取一段...
ARM Linux啟動過程分析
arm linux啟動過程分析 在 bootloader將 linux 核心映像拷貝到 ram 以後,可以通過下例 啟動linux 核心 call linux 0,machine type,kernel params base 其中,machine tpye是 bootloader檢測出來的處理器型...