下邊利用tomcat啓動spring項目來看看啓動過程中發生了什麼:
項目啓動過程比較長,本想着粘到編輯器中做解析,無奈字數超限,於是轉爲圖片,結果超出長度,不得已做了二次截圖才上傳成功,項目啓動的主要行爲大概都截到了,可以參考一下。
總結一下tomcat啓動加載順序:
1.啓動tomcat容器catalina,catalina 就是Tomcat服務器使用的 Apache實現的servlet容器的名字
2.容器監聽日誌打印出當前運行系統環境的tomcat版本號,系統名稱以及其他的硬件版本號,以及JDK所在的位置,以及JVM虛擬機的版本號。
3.初始化高併發的APR模式後,隨即就會指定tomcat運行的端口號,同時指定ajp-apr的端口號(AJP13是定向包協議。因爲性能原因,使用二進制格式來傳輸可讀性文本。),這也是tomcat快要啓動起來後看到的端口號。
4.初始化完相應參數後,Catalina服務纔算開始正式啓動;
5.開始運行tomcat內部核心的標準引擎
6.開始運行Servlet引擎;
7.在容器中初始化log4j;以上可以認爲是tomcat在正式工作前開始做的預備工作,發現沒有錯誤後,就可以正式初始化spring容器了,爲項目運行做最終準備。
8.開始初始化Spring root
9.優先搜索最基礎的配置文件並添加到StandardServletEnvironment中去,如servletConfigInitParams,servletContextInitParams,jndiProperties,systemProperties,systemEnvironment
10.完成添加會打印Initialized StandardServletEnvironment with PropertySources [servletConfigInitParams,servletContextInitParams,jndiProperties,systemProperties,systemEnvironment]
11.由於項目中配置的有servlet,所以tomcat檢測到後替換了默認的servlet配置,並刷新了根目錄的層級關係。
12.加載系統配置,應該是JDK;初始化完成後會打印出Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]
13.根據web.xml定義的規則查詢並加載spring配置,接着加載配置文件中xsd文件並使用編程接口解釋器JAXP解析;
14.開始加載Bean
15.加載標籤,如 aop - AopNamespaceHandler
c - SimpleConstructorNamespaceHandler
cache - CacheNamespaceHandler
context - ContextNamespaceHandler
jdbc - JdbcNamespaceHandler
jee - JeeNamespaceHandler
jms - JmsNamespaceHandler
lang - LangNamespaceHandler
mvc - MvcNamespaceHandler
oxm - OxmNamespaceHandler
p - SimplePropertyNamespaceHandler
task - TaskNamespaceHandler
tx - TxNamespaceHandler
util - UtilNamespaceHandler
16.解析之前加載到內存applicationContext文件中定義的bean
17.掃描mapper文件,尋找與MySQL配置相匹配的properties文件。
18.spring開始實例化bean,加載Class文件
19.爲實現類的目標文件創建動態代理
20.初始化字符過濾器
21.啓動成功
關於項目中涉及到的大部分主要關鍵點,都作了記錄。至於英文啓動環境及句柄的含義,有心可以對照網上查閱,這裏不便展開來說。
總結一下springMVC請求流程:
DispatcherServlet是一個分發器,控制着整個springMVC的流程有序。
①:DispatcherServlet是springmvc中的前端控制器(front controller),負責接收request並將request轉發給對應的處理組件.
②:HanlerMapping是springmvc中完成url到controller映射的組件.DispatcherServlet接收request,然後從HandlerMapping查找處理request的controller.
③:Cntroller處理request,並返回ModelAndView對象,Controller是springmvc中負責處理request的組件(類似於struts2中的Action),ModelAndView是封裝結果視圖的組件.
④ ⑤ ⑥:視圖解析器解析ModelAndView對象並返回對應的視圖給客戶端.