關係圖
借鑑網上看到的一張圖,來源於:
https://blog.csdn.net/zhanglf02/article/details/89791797
web容器中有servlet容器,spring容器,springmvc容器。
servlet容器保存 Servlet對象。
springmvc容器保存 Controller對象。
spring容器保存 Service、Dao對象。
spring容器是springmvc容器的父級容器。
容器基本創建流程
Tomcat啓動,對於每個WebApp,依次進行一下工作:
-
每個WebApp都有一個ServletContext。
-
項目啓動時,Tomcat會掃描項目的web.xml配置文件,找到Filter、Listener和Servlet等配置,並創建servlet容器。
-
如果web.xml配置了spring的ContextLoaderListener
3.1. 在ServletContext初始化時,ContextLoaderListener會創建spring容器,管理service層、dao層的Bean。
3.2. ContextLoaderListener會將spring容器的引用存放到ServletContext中一個屬性中。 -
如果web.xml配置了springmvc的DispatcherServlet
4.1. DispatcherServlet會在第一個請求到達時初始化。(DispatcherServlet的本質其實也是一個Servlet)
4.2. DispatcherServlet初始化時,會創建springmvc容器,管理controller層的Bean。
4.3. DispatcherServlet通過ServletContext獲取spring容器,並將spring容器設置爲springmvc容器的父級容器。(子容器可以訪問父容器,從而在Controller裏可以訪問Service對象,但是在Service裏不可以訪問Controller對象。) -
項目啓動完畢。
一個請求的處理流程
- http請求到達web容器後,會到達具體項目下的servlet容器。
- servlet容器根據請求路徑,找到對應的servlet對象。(默認全部由DispatcherServlet處理)
- DispatcherServlet通過處理映射器找到對應的controller對象(springmvc容器中),調用service對象、dao對象等等(spring容器中)執行各種業務操作…
(就是springmvc的基本處理流程,不贅述了。) - 返回結果。
refrence:
servlet容器,web容器,spring容器,springmvc容器的區別
爲啥Spring和Spring MVC包掃描要分開?
end