前言
最近在接触一个新项目的时候,接触到了SpringBoot的一些新的玩法,比如多版本控制,Class配置文件映射这些玩法,博主觉得自己对SpringBoot的了解还是停留在CRUD层面,所以工作之余去学习了SpringBoot更为底层的东西。
这里我们按照依赖–>注解–>配置的目录进行排版,尽量让大家对SpringBoot有更近一步的了解。话不多说,开始了!
正文
SpringBoot依赖
spring-boot-starter-parent
spring-boot-starter-parent是SpringBoot的父级依赖,表明当前项目是SpringBoot项目。如图所示:
该依赖的作用主要有以下几点:
- pom文件引入其他依赖可以不指定版本<version></version>
以导入quartz依赖为例,可以不指定version版本
但是完成依赖导入后,我们可以在maven中查看我们导入的quartz的版本为2.3.2
那么这个版本号到底取自哪里呢,答案就是spring-boot-starter-parent里面的spring-boot-dependencies提供的,它里面包含了一些依赖的版本信息,其中我们可以看到就有quartz的版本,如图所示:
所以正是因为在这里提供了依赖的版本,使得我们不必定义依赖也可以完成对依赖的引入。 - 默认使用Java8
- 默认使用UTF8编码
- 识别资源过滤,打包时把resource下的所有文件打包到包中
spring-boot-starter-web
spring-boot-starter-web这个依赖大家应该都不陌生,在之前的前后端不分离架构里,这个是必须要有的依赖。这个依赖主要是提供Web开发相关的依赖包,比如spring-boot-starter,spring-boot-starter-json,spring-boot-starter-tomcat,spring-webmvc等相关依赖。
SpringBoot注解
说起SpringBoot的注解大家一定不陌生,SpringBoot相比于SSM的优势之一也正是它基于注解的配置。所以SpringBoot给我们提供了许多注解,但是我们是否真正的了解每个注解的工作机制呢,注解是如何实现的呢?注解这么多,我们不可能一一了解,所以现在以@SpringBootApplication,@ConfigurationProperties,@Value,@PropertySource这几个注解为列来了解一下。
- @SpringBootApplication
@SpringBootApplication是SpringBoot启动类的注解,其中主要工作是完成SpringBoot的启动过程,也就是依赖注入过程。具体分析看这篇文章:SpringBoot启动时做了哪些工作
- @ConfigurationProperties和@Value
@ConfigurationProperties和@Value注解都是注入配置文件属性的值,其中用法如下:
两者的区别主要有以下几点:
1. cp是批量注入属性,value是一个个指定属性。
2. cp支持松散绑定,只需要指定一个前缀就可以引入该前缀下
的所有属性,value不支持。
3. cp支持jsr303,value不支持。
4. cp支持复杂类型,value不支持。
使用场景:少量需要引入配置属性的使用@Value,大量使用引入属性的使用@ConfigurationProperties。
- @PropertySource
@PropertySource注解是将配置文件注入到Spring环境中,然后通过@Value取值获取。
配置
配置文件随机数
SpringBoot的配置文件中可以配置随机数类型,包含int,long,uuid类型的随机数,通过${random.int},${random.long},${random.value}获取,然后在需要使用的地方通过@Value注解获取,例如:
多版本配置
SpringBoot支持多版本配置,通过配置多个不同的profile,然后在主配置文件里面设置开启哪个配置。这里,主配置文件为application.yml,开发环境为dev,生产环境为pro,测试环境为uat。以pro环境为例,查看启动端口号,如图:
spring.profiles.active替换为uat,查看启动端口。
如果你觉得在配置文件里面配置不够灵活,也可以在命令行模式或者虚拟机参数设置使用的环境版本。
命令行模式:--spring.profiles.active=dev
虚拟机参数:-Dspring.profiles.active-dev
自动配置原理
SpringBoot的自动配置主要是通@EnableAutoConfiguration注解实现的,当一个类被@EnableAutoConfiguration标注,就代表他是一个自动装配类。
被标为自动装配的Bean会被记录在META-INF/spring.factories下。通过@EnableAutoConfiguration里面的@Import注解里的选择器AutoConfigurationImportSelector的getCandidateConfigurations获取到配置文件的属性值。
最后获取成功后注入到容器里面。
@ConditionalOnClass(class类),当bean不存在时利用@EnableConfigurationProperties配置的属性初始化bean。完成bean的注入。