吃透SpringBoot

一.SpringBoot 介绍

SpringBoot对Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在 配置与逻辑 业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的 效率,一定程度上缩短 了项目周期

二.SpringBoot 基础

约定优于配置(Convention over Configuration),又称按约定编程,是一种软件设计范式。

约定优于配置简单来理解,就是遵循约定

三.SpringBoot 核心

1.起步依赖

起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

2.自动配置

springboot的自动配置,指的是springboot,会自动将一些配置类的bean注册进ioc容器,我们可以需 要的地方使用@autowired或者@resource等注解来使用它。 “自动”的表现形式就是我们只需要引我们想用功能的包,相关的配置我们完全不用管,springboot会自 动注入这些配置bean,我们直接使用这些bean即可 springboot: 简单、快速、方便地搭建项目;对主流开发框架的无配置集成;极大提高了开发、部署效率。

起步依赖

1.为什么导入dependency时不需要指定版本?

pom>>>>>spring-boot-starter-parent>>>>>spring-boot-dependencies

吃透SpringBoot_第1张图片

该文件通过标签对一些常用技术框架的依赖文件 进行了统一版本号管理,例如activemq、spring、tomcat等,都有与Spring Boot 2.2.2版本相匹配的 版本,这也是pom.xml引入依赖文件不需要标注依赖文件版本号的原因。

2.spring-boot-starter-parent父依赖启动器的主要作用是进行版本统一管理,那么项目运行依赖的JAR包是从何而来的?

pom>>>>>spring-boot-starter-web

吃透SpringBoot_第2张图片

spring-boot-starter-web依赖启动器的主要作用是提供Web开发场景所需的底层所有依赖.正是如此,在pom.xml中引入spring-boot-starter-web依赖启动器时,就可以实现Web场景开发,而不需要额外导入Tomcat服务器以及其他Web依赖文件等。当然,这些引入的依赖文件的版本号还是由 spring-boot-starter-parent父依赖进行的统一管理。

自动配置

1.Spring Boot到底是如何进行自动配置的,都把哪些组件进行了自动配置?

1.1 @SpringBootApplication    

吃透SpringBoot_第3张图片

Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法, @SpringBootApplication能够扫描Spring组件并自动配置Spring Boot

1.2 @SpringBootConfiguration

吃透SpringBoot_第4张图片

@SpringBootConfiguration注解内部有一个核心注解@Configuration,该注解是Spring框架提供的,表示当前类为一个配置类(XML配置文件的注解表现形式),并可以被组件扫描器扫描。

1.3@EnableAutoConfiguration

吃透SpringBoot_第5张图片

@EnableAutoConfiguration注解表示开启自动配置功能,该注解是Spring Boot框架最重要的注解,也是实现自动化配置的注解.可以发现它是一个组合注解,@EnableAutoConfiguration就是借助@Import 来收集所有符合自动配置条件的bean定义,并加载到IoC容器。

(1)@AutoConfigurationPackage

吃透SpringBoot_第6张图片

 吃透SpringBoot_第7张图片

@AutoConfigurationPackage注解的功能是由@Import注解实现的,它是 spring框架的底层注解,它的作用就是给容器中导入某个组件类

在Registrar类中有一个registerBeanDefinitions()方法,使用Debug模式启 动项目,可以看到选中的部分就是com.pcitc.lis。@AutoConfigurationPackage注解的主要作 用就是将主程序类所在包及所有子包下的组件到扫描到spring容器中。

(2) @Import({AutoConfigurationImportSelector.class})

吃透SpringBoot_第8张图片

将 AutoConfigurationImportSelector这个类导入到spring容器中, AutoConfigurationImportSelector可以帮助springboot应用将所有符合条件的@Configuration配置 都加载到当前SpringBoot创建并使用的IoC容器(ApplicationContext)中,通过源码分析这个类中是通过selectImports导入,这个方法告诉springboot都需要导入那些组件:

深入研究loadMetadata方法

吃透SpringBoot_第9张图片

 深入getCandidateConfigurations方法

吃透SpringBoot_第10张图片

 继续点开loadFactory方法

吃透SpringBoot_第11张图片

最终会去读取一个 spring.factories 的文件,读取不到会表这个错误,我们继续根据会看到,最终路径的长这样,而这个是spring提供的一个工具类

它其实是去加载一个外部的文件,而这文件是在

吃透SpringBoot_第12张图片

@EnableAutoConfiguration就是从classpath中搜寻META-INF/spring.factories配置文件,并将其中 org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的配置类,并加载到IOC容器中

这些自动配置类的本质是传统配置文件,只不过在Spring Boot中以自动配置类的形式进行了预先配置。因此,在SpringBoot项目中加入相关依赖启动器后,基本上不需要任何配置就可以运行程序,当然,我们也可以对这些自动配置类中默认的配置进行更改

总结

因此springboot底层实现自动配置的步骤是:

1. springboot应用启动;

2. @SpringBootApplication起作用;

3. @EnableAutoConfiguration;

4. @AutoConfigurationPackage

这个组合注解主要是 @Import(AutoConfigurationPackages.Registrar.class),它通过将Registrar类导入到容器中,而 Registrar类作用是扫描主配置类同级目录以及子包,并将相应的组件导入到springboot创建管理的容器中;

5. @Import(AutoConfigurationImportSelector.class)

它通过将 AutoConfigurationImportSelector类导入到容器中,AutoConfigurationImportSelector类作用 是通过selectImports方法执行的过程中,会使用内部工具类SpringFactoriesLoader,查找 classpath上所有jar包中的META-INF/spring.factories进行加载,实现将配置类信息交给 SpringFactory加载器进行一系列的容器创建过程

6.@ComponentScan注解

@ComponentScan注解具体扫描的包的根路径由Spring Boot项目主程序启动类所在包位置决定,在扫描过程中由前面介绍的@AutoConfigurationPackage注解进行解析,从而得到Spring Boot项目主程序启动类所在包的具体位置

四.执行原理

1.SpringApplication.run()方法到底是如何做到启动Spring Boot项目的呢?

吃透SpringBoot_第13张图片

SpringApplication.run()方法内部执行了两个操作,分别是 SpringApplication实例的初始化创建和调用run()启动项目

吃透SpringBoot_第14张图片

SpringApplication的初始化过程主要包括4部分

(1)this.webApplicationType = WebApplicationType.deduceFromClasspath()

用于判断当前webApplicationType应用的类型。deduceFromClasspath()方法用于查看Classpath类路 径下是否存在某个特征类,从而判断当前webApplicationType类型是SERVLET应用(Spring 5之前的传 统MVC应用)还是REACTIVE应用(Spring 5开始出现的WebFlux交互式应用)

(2)this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class))

用于SpringApplication应用的初始化器设置。在初始化器设置过程中,会使用Spring类加载器 SpringFactoriesLoader从META-INF/spring.factories类路径下的META-INF下的spring.factores文件中 获取所有可用的应用初始化器类ApplicationContextInitializer。

(3)this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class))

用于SpringApplication应用的监听器设置。监听器设置的过程与上一步初始化器设置的过程基本一样, 也是使用SpringFactoriesLoader从META-INF/spring.factories类路径下的META-INF下的 spring.factores文件中获取所有可用的监听器类ApplicationListener。

(4)this.mainApplicationClass = this.deduceMainApplicationClass()

用于推断并设置项目main()方法启动的主程序启动类

run

吃透SpringBoot_第15张图片

 吃透SpringBoot_第16张图片

项目初始化启动过程大致包括以下部分:

第一步:获取并启动监听器

第二步:根据SpringApplicationRunListeners以及参数来准备环境

第三步:创建Spring容器

吃透SpringBoot_第17张图片

第四步:Spring容器前置处理

第五步:刷新容器

第六步:Spring容器后置处理

第七步:发出结束执行的事件

吃透SpringBoot_第18张图片

第八步:执行Runners

Spring Boot执行流程图

吃透SpringBoot_第19张图片

你可能感兴趣的:(java,spring,boot,spring)