5、springmvc启动过程分析
一、基础概念
Spring Web MVC 框架提供”模型-视图-控制器”( Model-View-Controller )架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。
springmvc的核心是DispatcherServlet,它是请求调度控制器,负责拦截客户端请求,根据url通过HandlerMapping找到对应的handler,通过HandlerAdapter根据handler匹配对应的controller,完成接口调用后返回model,然后通过ViewResolver渲染视图,最后DispatcherServlet响应用户请求。
但是,对于目前主流的架构,前后端已经进行分离了,所以 Spring MVC 只负责 Model 和 Controller 两块,而将 View 移交给了前端。Handler(Controller) 执行完后,如果判断方法有 @ResponseBody 注解,则直接将结果写回给用户( 浏览器 )。
随着 Spring Boot 逐步全面覆盖到我们的项目之中,我们已经基本忘却当年经典的 Servlet + Spring MVC 的组合,那让人熟悉的 web.xml 配置。而本文,我们想先抛开 Spring Boot 到一旁,回到从前,一起来看看 Servlet 是怎么和 Spring MVC 集成,怎么来初始化 Springmvc 容器的。
二、分析springmvc初始化过程
1、项目目录
image.png
2、web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 配置DisaptcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数,配置springmvc配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc.xml</param-value>
</init-param>
<!-- web容器启动时加载该Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3、3个重要的类
继承关系: DispatcherServlet -> FrameworkServlet -> HttpServletBean
4、从HttpServletBean开始
4.1、init()方法
image.png
image.png
总结HttpServletBean的作用:
1、获取webxml中DispatcherServlet的初始化参数,把它添加到DispatcherServlet中。
5、接着调用FrameworkServlet的相关方法
5.1、initServletBean()方法
image.png
5.1、this.initWebApplicationContext()方法
image.png
5.2、this.createWebApplicationContext(rootContext)方法
image.png
总结FrameworkServlet的作用:
1、创建springmvc ioc容器,并绑定spring 父容器,可以访问父容器的bean。
2、最后解析springmvc.xml配置信息,完成springmvc容器的创建。
6、最后调用DispatcherServlet相关方法
6.1、onRefresh(ApplicationContext context)方法
6.2、this.initStrategies(context)方法
image.png
总结DispatcherServlet的作用:
1、初始化映射器、适配器、视图解析器。
三、springmvc初始化结束,保留一个问题
1、springmvc容器初始化的bean放在哪?