先构建好源码:https://www.yuque.com/jixiangkuaile/kk8w4w/mr0kcg

提出疑问 1!

SpringBoot启动就这一段run()代码,不需要配置Tomcat,就能启动整个服务,

为了解决疑问1,那么接下来就得通过Debug一步步看它是如何操作,竟能启动整个服务,而且还能进行请求和处理请求。

1、先打断点,并Debug启动

当代码停在断点处,说明要开始这段代码的操作了,下一步就是进去看看里面是什么情况

image.png

2、进来发现是调用run的重载方法

image.png

image.png

3、先创建容器

image.png

3.1、根据类型创建对应容器,并进行实例化

image.png

4、然后调用refresh方法

image.png

5、继续进入(还是在调用刷新方法)

5.1、进入刷新方法

image.png
image.png

5.2、进入刷新方法

image.png

5.3、进入刷新方法

image.png

5.4、进入刷新方法(此方法和Spring源码的refresh一样)

手动点,就是这样。
image.png
Debug是直接进去。

image.png

6、进去看是如何进行实例化其的Bean

如果是手动点就是如下,如果是Debug就直接进去
image.png

6.1、开始创建服务器

(到这里就开始慢慢接近 问题·1)
image.png

image.png

7、那么是如何创建服务器的呢?

image.png

7.1、先获取到对应的工厂

image.png

7.2、在对工厂进行实例化

image.png

7.3、返回实例化

.
image.png

7.4、再继续进入getWebServer方法

image.png

7.5、如果是手动点,则如下

image.png

image.png

8.、内嵌的Tomcat服务器就是在这里

image.png
image.png

疑问 2? 为什么可以获取到Tomcat工厂,单又没见端口呢?

1、回到创建对应的工厂哪里

根据这个问题,重新回到疑问1的 7.1那步骤去,Debug进去,看如何创建了这个Tomcat工厂,而不是别的呢?
image.png

2、为什么直接获取到Tomcat的名呢?

第一个是先得到默认的getBeanFactory

image.png
第二个是getBeanNamesForType
image.png

image.png

image.png

image.png

往上找到这里,发现一早就存入bean定义哪里了

image.png
image.png

遍历完就一路返回,最后就是为什么能取到Tomcat工厂了。

image.png

疑问?这个Tomcat工厂什么时候放到bean定义的,肯定是容器初始化的时候把??

2.1、

2.3、发现直接跳出来了

image.png

2.4、按快捷键 Ctrl + Shift +R 全局搜索这个名字

image.png

2.5、那如何判断什么时候用Tomcat什么时候用Jetty(这个和上面是相对的)

手动点击如下
image.png

image.png

回到刚刚的图片,工厂如何晓得是拿那一个呢
image.png

image.png

image.png

什么时候用Tomcat,什么时候用Jetty就是根据这个来判断的。
首先发现有@Bean就会去创建,但是又发现有@ConditionalOnClass,就判断是否符合条件,如果符合就创建,不符合就不创建,Tomcat再启动的时候,如果需要Bean对象,就通过Factory接口来判断,要调用的是哪一个。

疑问,为什么没有对应的jar包也不报错

有一个问题,为什么没有引入jetty的jar包的时候,它没有报错呢?而且上面还显示它们还报红哦,说明是没有的哦,这是因为spring-boot已经编译好了,(形成了class文件),直接运行都没问题的,因为已经编译好了,运行的时候就会取这个注解,和注解里面的值,都不设计这个红色的class,因为通过Server.class等这行都不涉及对应类的加载,所以得出的结论是: @ConditionalOnClass运行的时候不需要加载对应的类,
只有当需要加载对应的类发现没有才会报错,但是现在是不需要加载对应的类,所以红色也不会报错。

其实里面的逻辑是会尝试加载这个类,但是没有加载到就返回为空,就不会生成对应的Bean

(涉及到JVM的内容)

image.png

image.png

Tomcat和Jetty默认端口在哪里

默认端口都是8080,写在共同 的父类接口中,

进入父类的父类
image.png

image.png

image.png

自定义的端口什么时候给到它的呢

通过这里来看,是否直接获取配置的值
image.png

image.png

image.png

那么如何修改这个bean的属性呢?是什么机制呢?

其实改对象的属性,是利用bean的后置处理器机制去改的。

image.png

image.png

image.png

image.png

image.png