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

 更新时间:2017年07月16日 11:05:45   作者:Seven_Nee  
最近因为工作的原因在学习Spring MVC,为了更深入的学习Spring MVC,下面这篇文章主要给大家介绍了关于Spring MVC深入学习之启动初始化过程的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

虽然从学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.

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


SpringMVC 的 web.xml配置

web.xml 配置代码:

<?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负责请求分发,起到控制器的作用。下面详细来解释说明:


  • 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类的关系图:


用ContextLoaderListener初始化上下文,接着使用DispatchServlet来初始化WebMVC的上下文

总结

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

相关文章

  • org.apache.ibatis.annotations不存在的问题

    org.apache.ibatis.annotations不存在的问题

    这篇文章主要介绍了org.apache.ibatis.annotations不存在的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • MyBatis一级缓存与二级缓存原理与作用分析

    MyBatis一级缓存与二级缓存原理与作用分析

    mybatis-plus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章带你了解Mybatis的一级和二级缓存
    2022-12-12
  • Java8中利用stream对map集合进行过滤的方法

    Java8中利用stream对map集合进行过滤的方法

    这篇文章主要给大家介绍了关于Java8中利用stream对map集合进行过滤的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Java中URL传中文时乱码的解决方法

    Java中URL传中文时乱码的解决方法

    为什么说乱码是中国程序员无法避免的话题呢?这个主要是编码机制上的原因,大家都知道中文和英文的编码格式不一样,解码自然也不一样!这篇文章就给大家分享了Java中URL传中文时乱码的解决方法,有需要的朋友们可以参考借鉴。
    2016-10-10
  • jvm-jstack常用的用法示例

    jvm-jstack常用的用法示例

    jstack 是一个常用的用于分析 Java 进程的工具。它可以显示 Java 进程中所有线程状态和堆栈信息,帮助定位 Java 进程中的问题,这篇文章主要介绍了jvm-jstack常用的用法示例,需要的朋友可以参考下
    2023-06-06
  • SSH框架网上商城项目第22战之银行图标以及支付页面显示

    SSH框架网上商城项目第22战之银行图标以及支付页面显示

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第22战之银行图标以及支付页面显示,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 详解Spring Boot中初始化资源的几种方式

    详解Spring Boot中初始化资源的几种方式

    这篇文章主要介绍了详解Spring Boot中初始化资源的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • java合并多个文件的两种方法

    java合并多个文件的两种方法

    这篇文章主要为大家详细介绍了java合并多个文件的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 在MyBatis中使用 # 和 $ 书写占位符的区别说明

    在MyBatis中使用 # 和 $ 书写占位符的区别说明

    这篇文章主要介绍了在MyBatis中使用 # 和 $ 书写占位符的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 老生常谈foreach(增强for循环)和for的区别

    老生常谈foreach(增强for循环)和for的区别

    下面小编就为大家带来一篇老生常谈foreach(增强for循环)和for的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论