热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringMVC应用篇启动配置那些事

关于Spring Mvc的配置

 

传统的配置(Servlet2.0)

传统的Spring Mvc配置时须要在web.xml上配置以下内容:

Spring MVC应用篇---启动配置那些事

这其实是Servlet2.0的规范:

1.配置一个ContextLoaderListener作为spring容器初始化的监听器,这样web容器启动的时候(比如tomcat)会通过这个监听器初始化容器。

2.配置spring容器初始化时须要读取的配置文件,配合ContextLoaderListener使用。

3.配置一个DispatcherServlet,请求会经过这个Servlet,这是Spring Mvc的核心。

4.须要的话配置一个web mvc相关的配置文件,比如请求映射器;视图解析器;消息转换器等,这里和上面Spring容器的配置文件区分开来。

5.DispatcherServlet有个onRefresh方法须要初始化各种组件,底层是实现了Servlet的init接口,这里设为1的话,在项目启动的时候就会执行让DispatcherServlet初始化各种组件。如果不这么设的话,初始化会延迟到首次请求进来时,所以第一次请求的时候响应会比较慢。所以官方也建议设置为1。

6.配置DispatcherServlet的路径映射。

 

官网推荐配置(Servlet3.0&Tomcat8)

事实上,Spring官网现在已经推荐另外一种配置方式:

Spring MVC应用篇---启动配置那些事

只需要实现WebApplicationInitializer接口,可以看到官网给出的demo中的相关配置其实已经可以完全取代传统的web.xml了,且这种形式我们可以通过Java-Config加注解的形式来配置我们的项目,做到了“零xml”。

 

Servlet3.0新规范

那么Spring是如何做到的呢?这里就要讲到Servlet了,Servlet从3.0开始定义了一种新的规范,其定义了一个ServletContainerInitializer接口:

Spring MVC应用篇---启动配置那些事

白话说一下这个新规范:

1.我们只要自定义一个类,实现ServletContainerInitializer这个接口,重写其中的onStartup方法,然后在项目的META-INF/services目录下创建一个名字叫作javax.servlet.ServletContainerInitializer的文件,文件内容是上一步自定义类在项目中的路径。然后当web容器启动的时候就会自动去调用这个自定义类的onStartup方法。

2.只要在这个自定义类上加上HandlesTypes注解,然后指定一个Class类,那么项目中所有这个Class类的对象都会在onStartup方法执行时被赋到这个方法的第一个参数中。第二个参数是Servlet上下文对象。

Spring MVC应用篇---启动配置那些事

 

Spring MVC对Servlet3.0的实现

知道了Servlet3.0的新规范之后,我们来看下Spring MVC是怎么实现这个规范的。

spring-web模块中配置了一个javax.servlet.ServletContainerInitializer文件:

Spring MVC应用篇---启动配置那些事

javax.servlet.ServletContainerInitializer文件中指定了Spring自己的这个类:

Spring MVC应用篇---启动配置那些事

看下这个SpringServletContainerInitializer类:

Spring MVC应用篇---启动配置那些事

可以看到SpringServletContainerInitializer就实现了Servlet3.0的规范!@HandlesTypes注解中指定的就是WebApplicationInitializer类,看下SpringServletContainerInitializer实现的onStartup方法:

Spring MVC应用篇---启动配置那些事

所以回到最前面,只需要自定义个类实现WebApplicationInitializer接口,重写onStartup,那么web容器启动的时候,就会调用,Spring MVC官网就是在这个方法里进行了spring容器和DispatcherServlet的初始化工作。

 

Spring Boot是怎么做到的?

Spring Boot有两种启动方法:

第一种:jar包方式,直接在main函数中调用SpringApplication#run方法,内部其实是内建了一个tomcat,另外初始化了spring容器和DispatcherServlet,这里的DispatcherServlet也是通过一个TomcatStarter的类,最终来实例化出来的,TomcatStarter就是继承了ServletContainerInitializer。

这里不细讲,在后面分析Boot源码时再研究。

第二种:war包方式,war包是外置的tomcat。如果要使用这种方式,就要继承SpringBootServletInitializer这个类,可以看到SpringBootServletInitializer就是实现了WebApplicationInitializer这个接口。

Spring MVC应用篇---启动配置那些事


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 标题: ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因
    本文介绍了解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因。其中包括修改包名、解决service name重复、处理jar包冲突和添加maven依赖等解决方案。同时推荐了一个人工智能学习网站,该网站内容通俗易懂,风趣幽默,值得一看。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
author-avatar
濛宝贝儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有