My logo
Published on

Spring Boot 原理学习-01

1、Spring Boot项目的核心运行原理介绍

直接运行main方法,main方法会通过SpringApplication来进行启动,此时必然会干的几个事儿包括了,启动内嵌的tomcat作为web容器,初始化spring容器,基于自动装配把第三方框架的bean都初始化好注入spring容器,spring容器把所有打了注解的自己写的bean都初始化好放到容器里,包括了spring mvc的controller,mybatis的mapper

而且往往会把自定义的bean跟第三方框架的bean进行自动注入

最后tomcat启动完毕,可以接收http请求,spring容器和你自定义的bean,第三方框架的bean,全部初始化好,依赖注入好,spring mvc到spring到mybatis到其他框架,随时可以正常工作

往tomcat发送http请求,系统run起来。

以前的Web系统运行原理

springboot

2、Spring Boot到底是如何实现自动装配的

有一个核心的注解,@EnableAutoConfiguration,他是@SpringBootApplication注解给你带进来的,默认开启自动装配

很关键,他会扫描你的工程里集成的各个jar里面的spring.factories配置文件,这个配置文件是放在每个jar包的META-INF目录下的,里面就注册了这个框架自己的XXXAutoConfiguration。

每个第三方框架的XXXAutoConfiguration类都有@Conditional注解指定他生效的条件,这个条件类似于是,比如你有没有引入指定的依赖,有没有给个什么配置,或者有没有某个bean之类的。

完事儿了以后,如果你符合生效条件,那么此时会对XXXAutoCofiguration中定义的bean进行实例化,读取你在application.properties文件里定义的一些框架的具体配置,就能把bean实例化好了,注入spring容器。

3、Spring Boot项目的运行原理图

springboot

4、Initializer和Listener是如何读取的

推断,他是如何推断你的工程类型的呢?他内置写死了一些类,Servlet,应该是会在你的classpath里扫描所有你自己的类和你依赖的jar包里的类,做一个扫描的,如果扫到他内置写死的类,就推断你的工程类型是servlet,Java web工程。

Spring容器的ApplicationContextIntializer和ApplicationListener,都是接口,但是你自己可以写一些类实现这些接口,或者是你依赖的第三方的jar里可能有这些接口的实现类,他们分别在Spring容器初始化和容器发生事件的时候被回调。

spring boot很重视他们,直接推测在这里,扫描了classpath下的所有类,包括你自己的和第三方的jar,把上述两个接口的实现类都扫描出来,暂存起来,后续可能会有用,有可能是在spring boot初始化spring容器的时候去主动回调。

5、对已经看过的spring boot源码做一个梳理

为什么spring boot初始化的时候,一定要去扫描各种jar包里指定规范的配置文件里,配置的各种类,加载出来进行初始化呢?因为这些类都是各种框架实现的spring boot运行过程中的扩展点

在spring boot初始化的过程中,会去执行各种三方框架的扩展点

在refresh这里,有可能会去执行各种三方框架的扩展点的核心代码逻辑,spring容器需要扫描注解实例化bean,spring boot自己有自动装配,三方框架需要自动装配bean,tomcat、spirng mvc都需要自动装配,dubbo需要生成各种代理。

5、Spring Boot源码架构图

springboot

思维导图:

springboot