Spring MVC深入学习之启动初始化过程

时间:2022-09-23 15:42:55

前言

虽然从学java的第一个程序——helloworld至今,已经有好几个年头了。当时自己找资料,看视频,学习了java的输入输出流,多线程,网络编程等等, 而三大框架(struts、hibernate、spring)基本只是开了个头就出来实习了,尤其对于spring更是没有进行系统的学习, 虽然在实习的时候通过看项目,基本明白了spring mvc编程的框架是怎么回事,遇到需求知道如何写代码,在哪写代码,但是还是缺乏一个系统的认识。

因为最近公司项目使用 struts2 作为控制层框架,为了实现前后端分离,计划将 struts2 切换为 springmvc ,因此,这段时间都在学习新的框架,《spring实战》是一本好书,里面对 spring 的原理实现以及应用都说得很透彻,强烈推荐,但是如果想深挖 spring 的实现,还是要从他的源码入手,这次,就先从 springmvc 初始化开始。

  • web 容器初始化过程
  • springmvc的web.xml配置
  • dispatchservlet初始化

web容器初始化过程

web容器初始化的过程,其官方文档给出了这样的描述:

  1. instantiate an instance of each event listener identified by a <listener> element in the deployment descriptor.for instantiated listener instances that implement servletcontextlistener, call the contextinitialized() method.
  2. instantiate an instance of each filter identified by a <filter> element in the deployment descriptor and call each filter instance's init() method.
  3. instantiate an instance of each servlet identified by a <servlet> element that includes a <load-on-startup> element in the order defined by the load-on-startup element values, and call each servlet instance's init() method.

其初始化的过程实际如下:

Spring MVC深入学习之启动初始化过程

springmvc 的 web.xml配置

web.xml 配置代码:

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
   xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
 <context-param>
  <param-name>contextconfiglocation</param-name>
  <param-value>classpath:applicationcontext.xml</param-value>
 </context-param>
 
 <listener>
  <listener-class>org.springframework.web.context.contextloaderlistener</listener-class>
 </listener>
 
 
 <servlet>
  <servlet-name>mvc-dispatcher</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.dispatcherservlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
                                   
 <servlet-mapping>
  <servlet-name>mvc-dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
 
</web-app>
  • <listener>标签中定义了spring容器加载器
  • <servlet>标签中定义了spring前端控制器

在 servlet api中有一个servletcontextlistener接口,它能够监听servletcontext对象的生命周期,实际上就是监听web应用的生命周期。当servlet容器启动或终止web应用时,会触发servletcontextevent事件,该事件由servletcontextlistener来处理。在servletcontextlistener接口中定义了处理servletcontextevent 事件的两个方法contextinitialized()contextdestroyed()

contextloaderlistener监听器的作用就是启动web容器时,自动装配applicationcontext的配置信息。因为它实现了servletcontextlistener这个接口,在web.xml配置了这个监听器,启动容器时,就会默认执行它实现的方法。由于在contextloaderlistener中关联了contextloader这个类,所以整个加载配置过程由contextloader来完成。

dispatchservlet初始化

在springmvc架构中,dispatchservlet负责请求分发,起到控制器的作用。下面详细来解释说明:

Spring MVC深入学习之启动初始化过程

  • dispatchservlet名如其义,它的本质上是一个servlet,子类不断的对httpservlet父类进行方法扩展
  • httpservlet有两大核心方法:init()和service()方法。httpservletbean重写了init()方法,在这部分,我们可以看到其实现思路:公共的部分统一来实现,变化的部分统一来抽象,交给其子类来实现,故用了abstract class来修饰类名。此外,httpservletbean提供了一个httpservlet的抽象实现,使的servlet不再关心init-param部分的赋值,让servlet更关注于自身bean初始化的实现
  • frameworkservlet提供了整合web javabean和spring application context的整合方案。在源码中可以看到通过执行initwebapplicationcontext()方法和initframeworkservlet()方法实现
  • dispatchservlet是http请求的*调度处理器,它将web请求转发给controller层处理,它提供了敏捷的映射和异常处理机制,dispatchservlet转发请求的核心代码在doservice()方法中实现

dispatchservlet类和contextloaderlistener类的关系图:

Spring MVC深入学习之启动初始化过程

用contextloaderlistener初始化上下文,接着使用dispatchservlet来初始化webmvc的上下文

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://segmentfault.com/a/1190000010203210