Spring Boot不得不知的那点事
chenlong 发布:2021-09-12 10:36:17阅读:### 1.什么是Spring Boot
Spring 都需要大量的配置。而 Spring Boot 将我们从配置文件中解放了出来,Spring Boot 提供了大量的默认配置,我们只需要少数的配置甚至不配置,就可以建立起来一个 Spring Boot 应用
使用 Spring Boot 很容易创建一个独立运行(运行 jar,内嵌 Servlet 容器)、准生产级别的基于 Spring 框架的项目,使用 Spring Boot 你可以不用或者只需要很少的 Spring 配置。
### 2.Spring Boot的优缺点
##### 2.1.Spring Boot的优点
- 快速构建项目;使用Spring Initializr可以在几秒钟就配置好一个Spring Boot应用
- 对大量的框架都可以无缝集成,基本不需要配置或者很少的配置就可以运行
- 嵌入式 Servlet 容器的支持,如:Tomcat,Jetty 和 Undertow
- 提高开发、生产效率,如热部署等功能
- 提供监控功能,如跟踪,指标和健康状况
- 简化的安全性
- 丰富的 SQL 和 NoSQL 支持
##### 2.2.Spring Boot的缺点
- 版本迭代速度很快,一些模块改动很大。
- 由于不用自己做配置,报错时很难定位。
- 网上现成的解决方案比较少。
### 3.Spring Boot的核心功能
- 独立运行的 Spring 项目
Spring Boot可以以jar包的形式独立运行,运行一个Spring Boot项目只需通过java–jar xx.jar 来运行。
- 内嵌 Servlet 容器
Spring Boot可选择内嵌Tomcat、Jetty或者Undertow,这样我们无须以war包形式部署项目。
- 提供 starter 简化 Maven 配置
Spring提供了一系列的starter pom来简化Maven的依赖加载,例如,当你使用了spring-boot-starter-web 时,会自动加入依赖包。
- 自动配置 Spring
Spring Boot会根据在类路径中的 jar包、类,为jar包里的类自动配置 Bean,这样会极大地减少我们要使用的配置。当然Spring Boot只是考虑了大多数的开发场景,并不是所有的场景,若在实际开发中我们需要自动配置 Bean,而 Spring Boot 没有提供支持,则可以自定义自动配置。
- 准生产的应用监控
Spring Boot 提供基于http、ssh、telnet对运行时的项目进行监控。
- 无代码生成和xml配置
Spring Boot 的神奇的不是借助于代码生成来实现的,而是通过条件注解来实现的,这是 Spring 4.x 提供的新特性。Spring 4.x 提倡使用 Java 配置和注解配置组合,而 Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。
### 4.spring-boot-starter-parent的作用
- 定义了java编译版本
- 使用UTF-8格式编码
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127210926927.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
- 解决依赖版本问题
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127211457961.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
- 执行打包操作的配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127211403174.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
- 自动化的资源过滤
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021012721104879.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
- 自动化的插件配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127211208701.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
- 针对配置文件的资源过滤
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127211300210.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
### 5.Spring Boot的配置文件格式及区别
##### 两种格式
- application.properties
- application.yaml / application.yml
##### 区别
- *.properties 中文乱码,*.yml 不会
- *.properties 可以通过配置加载,*.yml 不支持
- *.properties 无序,*.yml 有序
### 6.Spring Boot自动装配原理
#### 一、从主程序 SpringBootApplication 开始
![在这里插入图片描述](https://img-blog.csdnimg.cn/202101272235104.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/202101272236032.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
##### (1)SpringBootConfiguration
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127224154643.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
- Configuration
这个注解我们再熟悉不过了,他就代表自己是一个Spring的配置类。所以我们可以认为:@SpringBootConfiguration = @Configuration
##### (2)EnableAutoConfiguration
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127225309649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
- AutoConfigurationPackage(自动配置包)
- Import(自动配置导入选择)
它帮我们导入了AutoConfigurationImportSelector,这个类中存在一个方法可以帮我们获取所有的配置,如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128210309303.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
getCandidateConfigurations()这个方法可以用来获取所有候选的配置;
实际上它返回了一个List,这个List是由loadFactoryNames()方法返回的,其中传入了一个getSpringFactoriesLoaderFactoryClass(),我们可以看看这个方法的内容;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128210522704.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
EnableAutoConfiguration.class,也就是说,它实际上返回的就是标注了这个类的所有包。标注了这个类的包不就是@SpringBootApplication吗;
所以我们可以得出结论:它兜兜转转绕了这么多地方,就是为了将启动类所需的所有资源导入;
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."),这句断言的意思是,configurations必须非空,否则就打印一段话,No auto configuration classes found in META-INF/spring.factories,也就是说不为空会去加载这个文件中的内容。
于是我们找到spring-boot-autoconfigure这个依赖里面的spring.factories,里面包含了很多自动配置属性如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128213324917.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
找一个自动配置点进去,如WebMvcAutoConfiguration:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128213838839.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
这里放了所有关于WebMvc的配置,如视图解析器、国际化等等。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128222022606.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
注:spring.factories中存在那么多的配置,每次启动时都是把它们全量加载显然是不现实的。
@ConditionalOnXXX:如果其中的条件都满足,该类才会生效。
所以在加载自动配置类的时候,并不是将spring.factories的配置全量加载进来,而是通过这个注解的判断,如果注解中的类都存在,才会进行加载。
所以就实现了:我们在pom.xml文件中加入stater启动器,SpringBoot自动进行配置。完成开箱即用。
#### 二、结论
当我们的SpringBoot项目启动的时候,会先导入AutoConfigurationImportSelector,这个类会帮我们选择所有候选的配置,我们需要导入的配置都是SpringBoot帮我们写好的一个一个的配置类,那么这些配置类的位置,存在与META-INF/spring.factories文件中,通过这个文件,Spring可以找到这些配置类的位置,于是去加载其中的配置。
即:
SpringBoot所有自动配置类都是在启动的时候进行扫描并加载,通过spring.factories可以找到自动配置类的路径,但是不是所有存在于spring,factories中的配置都进行加载,而是通过@ConditionalOnClass注解进行判断条件是否成立(只要导入相应的stater,条件就能成立),如果条件成立则加载配置类,否则不加载该配置类。
过程:
- SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
- 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作
- 以前我们需要自己配置的东西 , 自动配置类都帮我们解决了
- 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中
- 它将所有需要导入的组件以全类名的方式返回 , 这些组件就会被添加到容器中
- 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件
- 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128232349995.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MDc3NjA=,size_16,color_FFFFFF,t_70)
参考:https://zhuanlan.zhihu.com/p/95217578
### 7.SpringBoot的核心注解及组成
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
1. @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
1. @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
1. @ComponentScan:Spring组件扫描。
### 8.Spring Boot 的核心配置及区别
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
1. application 配置文件这个容易了解,主要用于 Spring Boot 项目的自动化配置。
1. bootstrap 配置文件有以下几个应用场景:
- 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中增加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 少量固定的不能被覆盖的属性;
- 少量加密/解密的场景;
### 8.Spring Boot开箱即用
输入项目构建信息和选择对应的组件就可以很快的构建项目。
1.采用 Spring Initializr 搭建:https://start.spring.io/
2.手动搭建参考:https://www.shiyanlou.com/courses/1152/learning/?id=7987
### Other
[https://mp.weixin.qq.com/s/zOCX2uFCtyfPsv_N2uzUuA](https://mp.weixin.qq.com/s/zOCX2uFCtyfPsv_N2uzUuA)
小礼物走一波,支持作者
赏还没有人赞赏,支持一波吧