那些看似简单的事物,其实并不简单。我们之所以觉得他简单,是因为复杂性都被隐藏了。通过上 诉代码,大概率可以提出以下几个疑问 SpringBoot是如何启动内置tomcat的 SpringBoot为什么可以响应请求,他是如何配置的SpringMvc

直接点入查看理解

1、从主函数的注解进入

image.png

2、进入自动注入Selector注解

image.png

3、选择Spring.factories进入

image.png

4、进入ServletWebServerFactoryAutoConfiguration类

image.png

5、进入EmbeddedTomcat

继续进入,看其是如何产生工厂的
image.png

6、在工厂里面可以创建Tomcat服务

这个也就是Tomcat是在Tomcat工厂里面进行创建的
image.png

7、看其是如何启动的

image.png

8、继续进入

image.png

9、启动刚刚创建的Tomcat

image.png

debug进入查看理解

主要是在refresh()方法的 onRefresh()方法中

1、SpringApplication#refreshContext方法直接进入

image.png

2、一路进入重载方法

image.png

3、继续进入

image.png

4、继续进入

image.png

5、onRefresh()继续进入

image.png

6、去创建服务

image.png

7、去获取Tomcat工厂

image.png

8、通过工厂去创建Tomcat对象

第一次是先进入获取实例,跳出来,再继续进入
image.png

9、选择的是Tomcat

image.png

10、创建Tomcat,并去启动

image.png

11、继续调用

image.png

12、去启动Tomcat

image.png

13、控制台打印启动标志

image.png

14、继续调用finishRefresh方法

image.png

14.1、去启动服务

image.png

14.2、正真的启动完成

image.png

其实是借助Tomcatjar 的类去实现了,只需要知道在哪些地方进行创建

这个方法大概做了以下几件事
1. 获取并启动监听器 通过加载META-INF/spring.factories 完成了 SpringApplicationRunListener实例化工作
2. 构造容器环境,简而言之就是加载系统变量,环境变量,配置文件
3. 创建容器
4. 实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误
5. 准备容器
6. 刷新容器
7. 刷新容器后的扩展接口 那么内置tomcat启动源码,就是隐藏在上诉

第六步:refreshContext方法里面,该方法最终会调 用到AbstractApplicationContext类的refresh()方法

image.png

springboot的内部通过 new Tomcat() 的方式启动了一个内置Tomcat。但是这里还有一个问题, 这里只是启动了tomcat,但是我们的springmvc是如何加载的呢?下一章我们讲接收, springboot是如何自动装配springmvc的