Spring Boot学习笔记03——配置文件汇总

学习前先新建好一个spring boot工程,记得勾选Spring Web
Spring Boot学习笔记03——配置文件汇总_第1张图片


一、配置文件

配置文件的作用是修改SpringBoot自动配置的默认值 ,spring boot通过这些配置帮我们完成自动配置,极大地提高了我们开发的效率,如果我们像改这些默认的配置,可以在全局配置文件中进行修改

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定
第一种:application.properties ,语法结构 :key=value,,新建项目就默认存在的,例如我们要改端口号:server.port=8081
Spring Boot学习笔记03——配置文件汇总_第2张图片
第二种:application.yml,语法结构 :key:空格value ,这种需要我们自己手动创建,例如我们要改端口号:

server:
	port:8081

Spring Boot学习笔记03——配置文件汇总_第3张图片

yaml以数据为中心,比json,xml等更适合做配置文件;
static:保存所有静态资源,如js,css,images
templates:保存所有模板页面(spring boot默认jar包使用嵌入式的tomcat,不支持jsp),可使用模板引擎


二、yaml语法展示

yaml对空格的要求很严格,如果少了空格,则对数据的配置就会失效;使用空格还可以用来表示层级关系(不允许用Tab键来缩进);属性和值的大小写。详细看下方的语法展示
yaml支持三种数据结构:

  • 对象
  • 一组按次序排列的值
  • 单个的,不可分割的值
    字符串默认不用加上单双引号,如果加上双引号会转移特殊字符,如\n到时候输出换行;单引号则不会转移特殊字符,\n直接纯输出“\n”

Spring Boot学习笔记03——配置文件汇总_第4张图片


三、使用yaml保存对象,设置属性

之前学ssm的时候我们把对象的创建都交给了spring容器,但是我们给对象的属性设置值时,需要通过注解@Value@Autowired等操作,这样相对来说还是比较繁琐的,这里我们可以通过yaml来进一步简化

创建目标类
student类

Spring Boot学习笔记03——配置文件汇总_第5张图片

pet类

Spring Boot学习笔记03——配置文件汇总_第6张图片

在yaml中配置对应的属性

注: 使用properties的话,则需在每个属性前加上student.,如student.namestudent.age,这样子相对yml的层级表示,会繁琐一些

Spring Boot学习笔记03——配置文件汇总_第7张图片

在目标类中加入对应的注解

@ConfigurationProperties的作用是将配置文件中的值映射到该类中一一对应

四、属性名匹配规则(Relaxed binding)

  • person.firstName:使用标准方式
  • person.first-name:大写用-
  • person.first_name:小写用_
  • PERSON_FIRST_NAME:系统属性推荐使用这种写法

Spring Boot学习笔记03——配置文件汇总_第8张图片如果加入@ConfigurationProperties后上面出现报红提示,这需要导入配置文件处理器,我们可以加入以下依赖,作用是配置文件进行绑定就会有提示


org.springframework.boot
spring-boot-configuration-processor
true

在测试类中进行测试
@SpringBootTest
class SbConfigApplicationTests {
    @Autowired
    private Student student;

    @Test
    void contextLoads() {
        System.out.println(student);
    }

}
结果

这里也有第二种方式获取配置文件中对象的属性值(不用@ConfigurationProperties注解):例如在name属性上加上注解Value("${student.name}")等等,但是这种方法没有直接用@ConfigurationProperties注解批量注入方便


五、JSR303校验

JSR303校验用于对目标属性的注入类型进行校验,我们只需在目标类上加入注解@Validated,然后在目标方法上加入对应的校验注解即可,对应的校验注解的message属性可以用来自定义报异常的提示内容

下面是一些常用的校验注解,校验注解也可以自定义,详细的可以到网上查
空检查

@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查

@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false

长度检查

@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.

日期检查

@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则


@Value@ConfigurationProperties比较

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 单个注入
松散绑定 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
当只是在业务逻辑中获取一下配置文件中的某项值,则使用@Value;如果是一个Bean专门获取配置文件的值来映射,则使用@ConfigurationProperties

@PropertySource@ImportResource@Bean

@PropertySource加载指定的配置文件
当我们把配置文件中的配置信息写在别的配置文件中需要指定读取这个配置文件时,如person.properties,就可以在目标类上加上注解@PropertySource(value={"classpath:person.properties"})来读取目标配置文件了

@ImportResource导入Spring的配置文件,让配置文件中的内容生效
spring boot中没有spring的配置我呢见,我们自己编写的配置文件也不能自动识别,要想其识别和加载进来,使用@ImportResource标注在一个配置类上

@Bean:将方法的返回值添加到容器中,容器中的这个组件默认的id就是方法名
使用这个方法要现在类的上面加上注解Configuration来指明当前类是一个配置类,用来代替之前的spring配置文件(在配置文件中使用标签来添加组件)


六、配置文件占位符

  1. 随机数
    ${random.value}${random.int}${random.long}${random.int(10)}${random.int[1024,65536]}
  2. 获取已配置过的值,如果没有可以使用“:xxx”来指定默认值
    ${app.name:默认值}

七、多环境配置

spring boot项目中会存在很多个配置文件,如开发用到,测试用的等等,这些配置文件中的具体内容都不同,那这些配置文件间的优先级和切换是怎么样的呢?

配置文件位置和优先级

下面是配置文件的有效存放位置和它们之间的优先级
Spring Boot学习笔记03——配置文件汇总_第9张图片

高优先级配置的内容会覆盖低优先级配置的内容,当项目打包成jar包后运行,当配置文件中的配置信息需要改动小部分时,运维人员可以通过在java - jar 目标jar包名称后加上spring.config,location=G:/xxx.properties来改变默认配置

互补配置:如果我们在高优先级的配置文件指定端口号为8089,那项目运行时就是使用8089端口,我们可以在一个低优先级的配置文件种指定一个8088的端口,然后加入server.context-path=/boot02,这样即使项目是用8089作为端口号,我们也可以在浏览器地址栏通过8088的端口下的/boot路径来访问资源(前提是我们提前设置好了访问/boot的控制器),这个就是互补配置

配置文件的切换

配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本,如application-test.properties 代表测试环境配置;

激活方式
  • 在主配置文件中指定:
    springboot默认启动主配置文件application.properties,我们可以在主配置文件中加入spring.profiles.active=test想要切换到我们自定义的其他配置文件(application-test配置文件)

  • 命令行

    • 在idea的右上角-配置选项-Edit configurations-Environment-Program arguments加入--spring.profiles.active=目标配置文件名
      Spring Boot学习笔记03——配置文件汇总_第10张图片
    • 将项目打成jar包,在命令行运行时,在java -jar jar包名 后加上--spring.profiles.active=目标配置文件名
  • 虚拟机参数
    在idea的右上角-配置选项-Edit configurations-Environment-VM options加入-Dspring.profiles.active=目标配置文件名

yml的多文档块

我们可以看到上面定义多个配置环境需要新建多个配置文件,这样相对来说也是会麻烦一些,我们可以在yaml中用“- - -”(三个横杠)来划分多个配置环境的信息(即在一个配置文件中实现多个配置文件信息的设置)

server:
  port: 8081
#选择要激活那个环境块
spring:
  profiles:
    active: prod

---
server:
  port: 8083
spring:
  profiles: dev #配置环境的名称dev


---

server:
  port: 8084
spring:
  profiles: prod  #配置环境的名称prod

七、外部配置方式

spring boot支持多种外部配置方式,官方文档(4.2. Externalized Configuration章节)对外部配置的介绍有17种,实际上用不到这么多,这里列出十一种

  1. 命令行参数
    java -jar jar包名 --server.port=8087
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties0)
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  10. @Configuration注解类上的@PropertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

spring boot可以从上面这些位置加载配置文件:优先级从高到低,高优先级配置覆盖低优先级配置,所有配置会形成互补配置;由jar包向jar包内进行寻找,优先加载带profile,再加载不带profile的


八、 我们可以在yaml中配置什么信息(自动装配原理2.0)

SpringBoot启动会加载大量的自动配置类,我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中,我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了),给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可

xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性

可以在配置文件中加入debug=true,在控制台看输出的日志信息;Positive matches:(自动配置类启用的:正匹配);Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配) ;Unconditional classes: (没有条件的类)


该SpringBoot学习笔记学习自雷神和狂神说前辈,是对知识点的整理和自我认识的梳理,如有不当之处,欢迎指出

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