.

SpringMVC启动流程分析计算机j

白癜风冬天怎么办 http://baidianfeng.39.net/a_ht/181228/6750443.html

SpringMVC是Spring系列框架中使用频率最高的部分。不管是SpringBoot还是传统的Spring项目,只要是Web项目都会使用到SpringMVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客就简要分析下SpringMVC的启动流程,帮助我们更好的理解这个框架。

为什么要写这篇博客

Spring的MVC框架已经出来很久了,网上介绍这部分的博客有很多很多,而且很多肯定比我自己写得好,那我还为什么要写这篇博客呢。一方面我觉得博客是对自己学习过程的一个记录,另一方面写博客的过程能加深自己对相关技术的理解,也方便以后自己回顾总结。

SpringMVC简介

什么是SpringMVC

要回答这个问题,我们先要说说MVC。MVC是一种设计模式,这种设计模式建议将一个请求由M(Module)、V(View)、C(controller)三个部分进行处理。请求先经过controller,controller调用其他服务层得到Module,最后将Module数据渲染成试图(View)返回客户端。SpringMVC是Spring生态圈的一个组件,一个遵守MVC设计模式的WEBMVC框架。这个框架可以和Spring无缝整合,上手简单,易于扩展。

解决什么问题

通常我们将一个J2EE项目项目分为WEB层、业务逻辑层和DAO层。SpringMVC解决的是WEB层的编码问题。SpringMVC作为一个框架,抽象了很多通用代码,简化了WEB层的编码,并且支持多种模板技术。我们不需要像以前那样:每个controller都对应编写一个Servlet,请求JSP页面返回给前台。

优缺点

用的比较多的MVC框架有Struts2和SpringMVC。两者之间的对比:

最大的一个区别就是Struts2完全脱离了Servlet容器,而SpringMVC是基于Servlet容器的;SpringMVC的核心控制器是Servlet,而Struts2是Filter;SpringMVC默认每个Controller是单列,而Struts2每次请求都会初始化一个Action;SpringMVC配置较简单,而Struts2的配置更多还是基于XML的配置。总的来说,SpringMVC比较简单,学习成本低,和Spring能无缝集成。在企业中也得到越来越多的应用。所以个人比较建议在项目中使用SpringMVC。

启动流程分析

PS:本文的分析还是基于传统的Tomcat项目分析,因为这个是基础。现在非常流行的SpringBoot项目中的启动流程后续也会写文章分析。其实原理差不多...

要分析SpringMVC的启动过程,要从它的启动配置说起。一般会在Tomcat的Web.xml中配置了一个ContextLoaderListener和一个DispatcherServlet。其实ContextLoaderListener是可以不配,这样的话Spring会将所有的bean放入DispatcherServlet初始化的上下文容器中管理。这边我们就拿常规的配置方式说明SpringMVC的启动过程。(PS:SpringBoot启动过程已经不使用Web.xml)

Tomcat启动的时候会依次加载web.xml中配置的Listener、Filter和Servlet。所以根据上面的配置,会首先加载ContextLoaderListener,这个类继承了ContextLoader,用来初始化Spring根上下文,并将其放入ServletContext中。下面就以这个为入口分析下代码。

Tomcat容器首先会调用调用ContextLoadListener的contextInitialized()方法,这个方法又调用了父类ContextLoader的initWebApplicationContext()方法。下面是这个方法的源代码。

至此,Spring的父(根)上下文已经初始化完毕,并且已经存在ServletContext中。

下面开始分析子上下文的初始化过程。这个过程通过SpringMVC的核心Servlet完成,所以我们也有必要讲下Servlet的生命周期。请求过来,判断Servlet有没创建,没有实例化并调用init方法,后面再调用service方法。我们在配置DispatcherServlet的时候,将其设置为启动时创建实例,所以Tomcat在启动的时候就会创建Spring的子上下文。

下面是DispatcherServlet的继承结构。

DispatcherServlet继承了FrameworkServlet,FrameworkServlet又继承了HttpServletBean,HttpServletBean又继承HttpServlet并且重写了init方法,所以创建子上下文时的入口就在这个init方法。

下面是FrameWorkServlet这个类的initServletBean()方法

下面是initWebApplicationContext()方法的具体代码

最后看下DispatcherServlet中的onRefresh()方法,这个方法初始化了很多策略:

到此为止,SpringMVC的启动过程结束了。这边做下SpringMVC初始化总结(不是很详细)

HttpServletBean的主要做一些初始化工作,将我们在web.xml中配置的参数书设置到Servlet中;FrameworkServlet主要作用是初始化Spring子上下文,设置其父上下文,并将其和ServletContext关联;DispatcherServlet:初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。简单总结

传统的SpringMVC项目启动流程如下:

如果在web.xml中配置了org.springframework.web.context.ContextLoaderListener,那么Tomcat在启动的时候会先加载父容器,并将其放到ServletContext中;然后会加载DispatcherServlet,因为DispatcherServlet实质是一个Servlet,所以会先执行它的init方法。这个init方法在HttpServletBean这个类中实现,其主要工作是做一些初始化工作,将我们在web.xml中配置的参数书设置到Servlet中,然后再触发FrameworkServlet的initServletBean()方法;FrameworkServlet主要作用是初始化Spring子上下文,设置其父上下文,并将其放入ServletContext中;FrameworkServlet在调用initServletBean()的过程中同时会触发DispatcherServlet的onRefresh()方法,这个方法会初始化SpringMVC的各个功能组件。比如异常处理器、视图处理器、请求映射处理等。




转载请注明:http://www.abachildren.com/jbzs/3738.html