概述
正如官网中所说,SpringMVC是Spring框架的一部分,是Spring对MVC架构的实现。
而常用的SpringMVC框架这个名字,也来自于spring-webmvc这个核心源码包。
整体关系
首先要对SpringMVC有一个较为全局的认识,它与Spring、Tomcat有着密切的关联。在SpringBoot框架下,个人整理出下面这张整体关系图。
在SpringBoot框架下,Spring、Tomcat和SpringMVC三者的初始化过程,是相互关联可以串联在一起的。
因此,可以对之前文章中写到的Spring初始化流程,再做一定的补充,画出下面这张简要的时序图。
Spring Web与SpringBoot
在详细探查SpringMVC与Spring、Tomcat的关系前,一个重要的前置知识点就是Spring Web程序与SpringBoot程序的不同。
以下是 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容器中注册。
SpringBoot的自动配置机制依赖于spring-boot-autoconfigure JAR包中的META-INF/spring.properties文件。这个文件列出了所有自动配置类,当@EnableAutoConfiguration被触发时,会加载这些配置类。