Spring的自动装配如何实现呢?

1、使用Spring Initializr方式构建Spring Boot项目

image.png

image.png

image.png
SpringBoot Tomcat搭建及剖析 - 图4

2、SpringBoot的启动源码剖析

为什么通过SpringApplication.run();这个方法就能启动项目呢,
其实可以根据代码一步步进行查看,其结论是先创建Spring容器,再启动Tomcat
和SpringMVC 是相反的。(相对SpringMVC更容易,因为它需要依赖Tomcat依赖的机制接口等)
而Spirigboot 就

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

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

image.png

那如何判断什么时候用Tomcat什么时候用Jetty

看这个类
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