之前并没有意愿写关于下面内容的小作文。因为总结SPI相关的标准(SPI机制之JDK中的SPI - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)),而这个也是关于标准的,Servlet3.0以上标准的一个小知识点。就回忆了一下下面的内容,好记性不如烂笔头还是老老实实做总结笔记吧。

  一般入门的web项目,使用集成开发工具都会自建一个web.xml的文件。该文件中配置servlet/filter/listener等相关信息。如下图:

    

  Spring提供接口WebApplicationInitializer,通过自定义实现该接口配置web.xml里的相关信息。查看该接口源码:

    

  同时该接口源码注释中提供了多个示例,下图是示例之一:

    

  ,这个servletContext可以直接理解为常用的容器tomcat的一个实例。如果使用其他的符合servlet标准的容器,也可以理解为其他容器的一个实例。

  为什么单拧这个出来呢?之前关于Spring Boot自动配置SpringMVC简单提到过其可以直接在容器中运行。那么web项目的启动信息是如何与容器比如tomcat中直接运行的,即tomcat是如何识别这个web项目的?这里就涉及一个标准~Servlet3.0以上版本的标准吧。

  为什么?实际上Servlet3.0以上的标准中,运行时可插拔性为SpringBoot自动配置MVC后并自动在容器中运行提供了可能。具体实现通过ServletContainerInitializer

  1)ServletContainerInitializer类通过jar services API查找。对于每一个应用,应用启动时,有容器创建一个ServletContainerInitializer实例。

  2)自定义的应用提供的ServletContainerInitializer试了下必须绑定在jar包的META-INF/services目录中的一个叫做javax.servlet.ServletContainerInitializer的文件中,并根据这个文件指定ServletContainerInitializer的实现。

    这个规则其实就是SPI机制的约定之一。

  3)除了ServletContainerInitializer外,还提供一个注解@HandlesTypes。在ServletContainerInitializer实现上的HandlesTypes注解用于表示感兴趣的一些类,他们可以指定@HandlesTypes的value中的注解(类型、方法或自动级别的),或者是其类型的超类继承/实现之一。

  以上通过具体操作的解释如下:

  1、编写自定义一个类实现ServletContainerInitializer

    

    其方法名就是onStartup,调用自定义实现WebApplicationInitializer的类或子类的方法onStartup

  2、通过@HandlesTypes传递web配置信息,编写实现WebApplicationInitializer的类即可。(可以是其他类或子类,但是此处是针对SpringMVC,必须实现WebApplicationInitializer)

    

    具体的一个实现如下:

    

  3、文件编写META-INF/services目录中的一个叫做javax.servlet.ServletContainerInitializer

    

    

    文件内容为实现ServletContainerInitializer的类全限定名。

  这样启动tomcat容器时,tomcat自动扫描该项目jar下的所有META-INF/services目录中的一个叫做javax.servlet.ServletContainerInitializer的文件,执行文件MySpringServletContainerInitializer类的onStartup方法,其通过反射自动调用MyWebApplicationInitializer的onStartup方法。

  javax.servlet.ServletContainerInitializer作为纽带将容器与WebApplicationInitializer关联起来。下面验证SpringBoot中SpringMVC自动配置是否符合此逻辑:

  1、SpringBoot添加web依赖

    

  2、查看加载的jar中是否存在META-INF/services目录中的一个叫做javax.servlet.ServletContainerInitializer

    

    

  3、查看SpringServletContainerInitializer类具体实现

    

  4、查看WebApplicationInitializer的实现

    

  

  

  

SpringMVC的web配置的更多相关文章

  1. SpringMVC源码情操陶冶-FreeMarker之web配置

    前言:本文不讲解FreeMarkerView视图的相关配置,其配置基本由FreeMarkerViewResolver实现,具体可参考>>>SpringMVC源码情操陶冶-ViewRe ...

  2. spring 和springmvc 在 web.xml中的配置

    (1)问题:如何在Web项目中配置Spring的IoC容器? 答:如果需要在Web项目中使用Spring的IoC容器,可以在Web项目配置文件web.xml中做出如下配置: <!-- Sprin ...

  3. SpringMVC框架入门配置 IDEA下搭建Maven项目

    初衷:本人初学SpringMVC的时候遇到各种稀奇古怪的问题,网上各种技术论坛上的帖子又参差不齐,难以一步到位达到配置好的效果,这里我将我配置的总结写到这里供大家初学SpringMVC的同僚们共同学习 ...

  4. springboot情操陶冶-web配置(七)

    参数校验通常是OpenApi必做的操作,其会对不合法的输入做统一的校验以防止恶意的请求.本文则对参数校验这方面作下简单的分析 spring.factories 读者应该对此文件加以深刻的印象,很多sp ...

  5. springboot情操陶冶-web配置(三)

    承接前文springboot情操陶冶-web配置(二),本文将在前文的基础上分析下mvc的相关应用 MVC简单例子 直接编写一个Controller层的代码,返回格式为json package com ...

  6. springmvc基础使用配置

    前言 本案例是在idea编辑器下,maven管理项目的前提下. 步骤 1.新建maven项目 2.配置web.xml <?xml version="1.0" encoding ...

  7. 关于什么是SpringMVC,和SpringMVC基于xml配置、注解配置、纯注解配置

    首先我们先要了解一下,什么是SpringMVC? SpringMVC是Spring框架内置的MVC的实现.SpringMVC就是一个Spring内置的MVC子框架,也就是说SpringMVC的相关包都 ...

  8. java框架之SpringBoot(5)-SpringMVC的自动配置

    本篇文章内容详细可参考官方文档第 29 节. SpringMVC介绍 SpringBoot 非常适合 Web 应用程序开发.可以使用嵌入式 Tomcat,Jetty,Undertow 或 Netty ...

  9. SpringMVC加载配置Properties文件的几种方式

    最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大, 网上介绍Controller参数绑定.URL映射的文章都很多了,写这篇博客主要总结一下 ...

随机推荐

  1. SSM工程常见问题

    1.引入Junit测试 <!--引入junit单元测试,两个一起引用,spring-test版本要与Spring-core保持一致--> <dependency> <gr ...

  2. 主流浏览器内核、css权重

    主流浏览器及其内核: IE:trident Firefox:Gecko Google Chrome:webkit/blink Safari:webkit Opera:presto css权重 优先级大 ...

  3. 聊聊dubbo协议

    搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 协议 协议通俗易懂地解释就是通信双方需要遵循的约定. 我们了解的常见的网络传输协议 ...

  4. Solon 开发

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  5. leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II

    33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...

  6. 007 Linux 命令三剑客之-awk

    01 一起来认识 awk! Linux 命令三剑客,sed.grep.awk. sed:擅长数据修改. grep:擅长数据查找定位. awk:擅长数据切片,数据格式化,功能最复杂. awk 更适合格式 ...

  7. 运用Spring Aop,一个注解实现日志记录

    运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...

  8. Vue2和Vue3技术整理1 - 入门篇 - 更新完毕

    Vue2 0.前言 首先说明:要直接上手简单得很,看官网熟悉大概有哪些东西.怎么用的,然后简单练一下就可以做出程序来了,最多两天,无论Vue2还是Vue3,就都完全可以了,Vue3就是比Vue2多了一 ...

  9. JVM专题3: GC 垃圾回收

    合集目录 JVM专题3: GC 垃圾回收 什么是GC? 为什么要有 GC? Garbage Collection, 用于内存回收. 简述一下 Java 垃圾回收机制? 那些内存需要回收 虚拟机中程序计 ...

  10. 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制

    16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...