天天看点

你真的会SpringBoot了吗?

前言

最近在接触一个新项目的时候,接触到了SpringBoot的一些新的玩法,比如多版本控制,Class配置文件映射这些玩法,博主觉得自己对SpringBoot的了解还是停留在CRUD层面,所以工作之余去学习了SpringBoot更为底层的东西。

这里我们按照依赖–>注解–>配置的目录进行排版,尽量让大家对SpringBoot有更近一步的了解。话不多说,开始了!

正文

SpringBoot依赖

spring-boot-starter-parent

spring-boot-starter-parent是SpringBoot的父级依赖,表明当前项目是SpringBoot项目。如图所示:

你真的会SpringBoot了吗?

该依赖的作用主要有以下几点:

  • pom文件引入其他依赖可以不指定版本<version></version>

    以导入quartz依赖为例,可以不指定version版本

    你真的会SpringBoot了吗?
    但是完成依赖导入后,我们可以在maven中查看我们导入的quartz的版本为2.3.2
    你真的会SpringBoot了吗?
    那么这个版本号到底取自哪里呢,答案就是spring-boot-starter-parent里面的spring-boot-dependencies提供的,它里面包含了一些依赖的版本信息,其中我们可以看到就有quartz的版本,如图所示:
    你真的会SpringBoot了吗?
    所以正是因为在这里提供了依赖的版本,使得我们不必定义依赖也可以完成对依赖的引入。
  • 默认使用Java8
    你真的会SpringBoot了吗?
  • 默认使用UTF8编码
    你真的会SpringBoot了吗?
  • 识别资源过滤,打包时把resource下的所有文件打包到包中
    你真的会SpringBoot了吗?

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的注解大家一定不陌生,SpringBoot相比于SSM的优势之一也正是它基于注解的配置。所以SpringBoot给我们提供了许多注解,但是我们是否真正的了解每个注解的工作机制呢,注解是如何实现的呢?注解这么多,我们不可能一一了解,所以现在以@SpringBootApplication,@ConfigurationProperties,@Value,@PropertySource这几个注解为列来了解一下。

  • @SpringBootApplication

    @SpringBootApplication是SpringBoot启动类的注解,其中主要工作是完成SpringBoot的启动过程,也就是依赖注入过程。具体分析看这篇文章:SpringBoot启动时做了哪些工作

  • @ConfigurationProperties和@Value

    @ConfigurationProperties和@Value注解都是注入配置文件属性的值,其中用法如下:

    你真的会SpringBoot了吗?
    你真的会SpringBoot了吗?

两者的区别主要有以下几点:

1. cp是批量注入属性,value是一个个指定属性。
	2. cp支持松散绑定,只需要指定一个前缀就可以引入该前缀下
	的所有属性,value不支持。
	3. cp支持jsr303,value不支持。
	4. cp支持复杂类型,value不支持。	
           

使用场景:少量需要引入配置属性的使用@Value,大量使用引入属性的使用@ConfigurationProperties。

  • @PropertySource

    @PropertySource注解是将配置文件注入到Spring环境中,然后通过@Value取值获取。

你真的会SpringBoot了吗?
你真的会SpringBoot了吗?

配置

配置文件随机数

SpringBoot的配置文件中可以配置随机数类型,包含int,long,uuid类型的随机数,通过${random.int},${random.long},${random.value}获取,然后在需要使用的地方通过@Value注解获取,例如:

你真的会SpringBoot了吗?
你真的会SpringBoot了吗?

多版本配置

SpringBoot支持多版本配置,通过配置多个不同的profile,然后在主配置文件里面设置开启哪个配置。这里,主配置文件为application.yml,开发环境为dev,生产环境为pro,测试环境为uat。以pro环境为例,查看启动端口号,如图:

你真的会SpringBoot了吗?
你真的会SpringBoot了吗?
你真的会SpringBoot了吗?

spring.profiles.active替换为uat,查看启动端口。

你真的会SpringBoot了吗?
你真的会SpringBoot了吗?

如果你觉得在配置文件里面配置不够灵活,也可以在命令行模式或者虚拟机参数设置使用的环境版本。

命令行模式:--spring.profiles.active=dev
虚拟机参数:-Dspring.profiles.active-dev
           

自动配置原理

SpringBoot的自动配置主要是通@EnableAutoConfiguration注解实现的,当一个类被@EnableAutoConfiguration标注,就代表他是一个自动装配类。

你真的会SpringBoot了吗?
你真的会SpringBoot了吗?

被标为自动装配的Bean会被记录在META-INF/spring.factories下。通过@EnableAutoConfiguration里面的@Import注解里的选择器AutoConfigurationImportSelector的getCandidateConfigurations获取到配置文件的属性值。

最后获取成功后注入到容器里面。

@ConditionalOnClass(class类),当bean不存在时利用@EnableConfigurationProperties配置的属性初始化bean。完成bean的注入。

你真的会SpringBoot了吗?
你真的会SpringBoot了吗?

继续阅读