找到Spring官网,找到MVC模块
https://spring.io/projects/spring-framework
SpringMVC框架搭建流程
开发过程,其实之前也写过了 https://www.yuque.com/jixiangkuaile/kk8w4w/ogy29f
1)新建maven项目,注意选择webapp骨架
2)引入依赖,并配置DispatcherServlet前端控制器
3)开发处理具体业务逻辑的Handler(@Controller、 @RequestMapping)
4)xml配置文件配置controller扫描,配置springmvc三件文
5)将xml文件路径告诉springmvc(DispatcherServlet)
1.1、新建maven项目,注意选择webapp骨架


1.2、创建成功但没有src等目录,那就自己创建


2.1、在整个项目的pom.xml文件中引入依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.slin.edu</groupId><artifactId>slin-spring-mvc</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--引入spring webmvc的依赖因为springweb是spring的外部功能,所以一定会依赖springcontext这些功能--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.12.RELEASE</version></dependency></dependencies><build><plugins><plugin><!--要把tomcat的插件引入进来--><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><!--指定端口号--><path>/</path><!--指定上下文--></configuration></plugin></plugins></build></project>
2.2、配置DispatcherServlet前端控制器
这里整体可以称之为 springmvc相关配置,但是整个项目是通过Tomcat来启动的,实则是先配置Tomcat,
所有请求过来的连接都是经过Tomcat的。
先看一下官网对这个类的解析
web.xml配置寄存器和初始化的示例DispatcherServlet(从官网拷贝)
先要注意一点:
删除后的配置如下
2.3、可以先不用父容器,也能完整SpringMVC的工作

先看一下子容器的配置文件
3.1、开发处理具体业务逻辑的Handler(@RestController、 @GetMapping)

4.1、就是部署Tomcat并发布,测试
当然,也可以内置Tomcat
启动没有报错,但是访问出现如下情况
那么就需要将项目发布才可以,就得需要如下操作

4.2、调用访问路径查看效果

对项目下面的配置文件进行分析
1、对应web.xml,spring.xml是什么东西,谁用的

2、对于请求流程的分析
3、为什么配置Spring.xml在下面呢

整个过程是如何的呢?
A、首先是启动Tomcat
B、然后找到web.xml指定的DispatcherServlet去实例化
C、在Servlet规范中,任何一个Servlet都可以实现一个init()方法。当上面的DispatcherServlet实例化完后,就会去调用init() 方法。
在Tomcat启动后,所有的DispatcherServlet实例创建好之后,就会准守Servlet的规范,去调用DispatcherServlet.init() 方法。
1、先看Servlet规范中的init()方法
通过DispatcherServlet类一直找到其父类的父类,反正找到最顶的Servlet,并找到init()方法
2、debug 进去

3、初始化容器

4、那么进来看是如何初始化的

5、继续调用重载方法

6、开始看到去调用实例化类

7、调用无参构造从实例化

8、构造器进行实例化


然后就是一路返回到第6点
9、得到容器,给容器赋值
先看配置文件

再看如何赋值及启动


啥是父子容器呢
1、父子容器模型图

2、整个项目中如何配置父子容器呢
就得需要借助Tomcat的监听机制,来告诉它给单独创建一个父容器

有了这个监听机制,也就是说,除了要实现之前的东西外,还要调用监听类里面的对应方法,去创建容器
看源码如何通过监听机制去创建容器的呢?
1、

2、

3、debug进来

4、父容器得到创建了


5、当父容器创建完毕,再创建子容器,则传给子容器

=========Tomcat调用配置文件创建容器的过程=================
HttpServletBean#init
FrameworkServlet#initServletBean
FrameworkServlet#initWebApplicationContext
FrameworkServlet#createWebApplicationContext
FrameworkServlet#createWebApplicationContext
BeanUtils#instantiateClass
 
零配置底层原理分析
1、看官网介绍

2.1、如何实现零配置呢
2.2、

2.3、如何实现父子容器呢

3、把web.xml都注掉,然后重新启动

4、疑问来了

4.1、就得看它是从哪里调进来的(查看调用栈)

4.2、通过Tomcat提供一个接口给开发者进行实现

里面的方法是这个
4.3、SpringServletContainerInitializer实现了上面的接口
然后通过SPI机制进行配置,然后Tomcat启动就会找到开发这所实现的那个类,调用onStartup方法


所以就调到自己写的onStartup() 方法
1、最主要的是先通过SPI机制找到要初始化的类
2、就找到初始化类的onStartup方法
3、再找到自定义的实现类的onStartup方法

