关系图
借鉴网上看到的一张图,来源于:
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