SpringMVC详解(一):整体关系

176 阅读2分钟

概述

正如官网中所说,SpringMVC是Spring框架的一部分,是Spring对MVC架构的实现。 image.png

而常用的SpringMVC框架这个名字,也来自于spring-webmvc这个核心源码包。 image.png

整体关系

首先要对SpringMVC有一个较为全局的认识,它与Spring、Tomcat有着密切的关联。在SpringBoot框架下,个人整理出下面这张整体关系图。

SpringBoot-Spring-SpringMVC-Tomcat.jpg

在SpringBoot框架下,Spring、Tomcat和SpringMVC三者的初始化过程,是相互关联可以串联在一起的。

因此,可以对之前文章中写到的Spring初始化流程,再做一定的补充,画出下面这张简要的时序图。

SpringBoot-Spring-SpringMVC-Tomcat2.jpg

Spring Web与SpringBoot

在详细探查SpringMVC与Spring、Tomcat的关系前,一个重要的前置知识点就是Spring Web程序与SpringBoot程序的不同。

springdoc.cn/spring/web.…

以下是 web.xml 配置的例子。这段配置会使得 Web 容器在启动 Web 应用时,首先初始化 ContextLoaderListener,该监听器负责创建 Spring 应用上下文(即 Spring 容器),然后初始化 DispatcherServlet。

<web-app>
    <!-- 配置 ContextLoaderListener 启动 Spring 容器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-context.xml</param-value>
    </context-param>
    <!-- 配置 DispatcherServlet 启动 Spring MVC 框架 -->
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>

</web-app>

或者上面这个xml配置写成java代码,是一样的:

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AppConfig.class);
        // 通过 `AnnotationConfigWebApplicationContext` 创建 Spring 容器
        // 并使用 `ContextLoaderListener` 来初始化它
        servletContext.addListener(new ContextLoaderListener(context));
        // 同时配置 DispatcherServlet
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

Spring Boot遵循不同的初始化顺序。Spring Boot不是挂入Servlet容器的生命周期,而是使用Spring配置来启动自己和嵌入式Servlet容器。Filter 和 Servlet 声明在Spring配置中被检测到,并在Servlet容器中注册。

springdoc.cn/spring-boot…

SpringBoot的自动配置机制依赖于spring-boot-autoconfigure JAR包中的META-INF/spring.properties文件。这个文件列出了所有自动配置类,当@EnableAutoConfiguration被触发时,会加载这些配置类。

image.png image.png