Spring Boot教程系列-02 Spring Boot配置

整理自雷丰阳_尚硅谷

Spring Boot配置

配置文件

Spring Boot使用一个全局的配置文件,用于修改SringBoot自动配置的默认值。配置文件名是固定的。

  • application.properties
  • application.yml

YAML

以前的配置文件大都使用xml文件。YAML以数据为中心,比json,xml更适合做配置文件。xml大量的数据浪费在了标签的开立上。
YAML

server:
	prot: 8081

XML:

<server>
	<port>8081</port>
</server>

YAML语法

基本语法

  • k: v表示一对键值对。
  • 以空格的缩进来控制层级关系,只要是左对齐的一列数据,就是一个层级的
  • 属性和值是大小写敏感的

注: v前面的空格必须有

值的写法

字面量

普通的值(数字,字符串,布尔)
k: v 字面直接来写

注: 字符串不用加单引号或双引号
""双引号:不会转义特殊字符,特殊字符会按照想表示的意思输出
''单引号:会转义特殊字符,特殊字符失去功能,输出字符本体
例:
name: “zhangsan \n lisi” 输出 zhangsan 换行 lisi
name: ‘zhangsan \n lisi’ 输出 zhngsan \n lisi

对象、map(键值对)

也是 k: v 的形式
例:
正常写法

friends:
	lastName: zhangsan
	age: 20

行内写法

friends: {lastName: zhangsan, age: 20}

数组(List,Set)

用- 值表示数组中的元素
正常写法

pets:
	- cat
	- dog
	- pig

行内写法

pets: [cat, dog, pig]

YAML配置文件值注入

目的:用一个类来接收配置yml文件里的内容
步骤:

  1. 创建一个接收yml配置的bean类
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;
  1. 写配置
person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {k1: v1, k2: v2}
  lists:
    - lisi
    - zhaoliu
  dog:
    name: 好看
    age: 2
  1. 给这个类前面标上@Component@ConfigurationProperties(prefix = "person")
  2. 导入配置文件处理器,配置文件进行绑定就会有提示
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
  1. 测试

解释:

  1. @ConfigurationProperties
    告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
    prefix = "person":配置文件中那个下面的所有属性进行一一映射
  2. @Component
    只有这个组件是容器中的组件,才能用容器提供的@ConfigurationProperties功能
  3. 测试
    Spring Initializer自动创建了test里的单元测试

properties配置文件注入

同上,写application.properties文件的配置

person.last-name=张三
person.age=18
person.birth=2017/12/12
person.boss=false
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.dog.name=dog
person.dog.age=2

:application.properties默认用ASCII解码,需要设置一下和UTF-8的转换。在IDEA的setting中file encoding,勾上Tansparent native to ascii conversion。

和@Value的区别

@Value的使用

在需要绑定的属性前,注解@Value,括号内填写绑定的值。值可以为字面量、${}从环境变量、配置文件中获取值、#{SpEL}

例:
@Value("${person.last-name}")
@Value("#{11*2}")
@Value(“true”)

和@ConfigurationProperties对比

@ConfigurationProperties@Vaue
功能批量注入配置文件中的属性一个个制定
松散绑定支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

松散绑定(Relaxed binding)

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

JSR303数据校验
在类名上添加@Validated,在属性上添加@Email

报错处理

报错:
@Email为红
解决:
添加依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

结论

如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value。相当于直接把配置文件中的某个值直接获取到类中某个值。
如果专门写了一个JavaBean来和配置文件映射,就直接使用@ConfigurationProperties

@PropertySource和@ImportResource

@PropertySource

加载指定的配置文件,而@ConfigurationProperties默认从全局配置文件中获取值

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {

@ImportResource

导入spring的配置文件,让配置文件里的内容生效
【跳过,不懂,之后填坑】

配置文件占位符

配置文件中使用随机数

${random.uuid}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}

配置文件使用前面的赋值

如果没有,使用:使用默认值
${person.lastName:Peter}

Profile

多profile文件

在注配置文件编写时,文件名可以是 application-{profile}.properties/yml即可以动态切换

激活制定文件

在application.properties/yml中设置spring.profiles.active=dev来激活要使用的配置文件

多文档块

在application.yml文件里用---区分不同文档块
在最上面的文档块里面激活
在下面的文档块中用

spring:
	prfiles: dev

来定义文档块名称
例:

server:
  port: 8081
spring:
  profiles:
    active: prod
---
server:
  port: 8081
spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: prod

命令行激活

方法1
--spring.profiles.active=dev
在运行里的 Edit Configuration 中的 Program Arguments里添加
方法2
打包,maven->package
命令行运行java -jar xxxx.jar --spring.profiles.active=dev
方法3
虚拟机参数
在运行里的 Edit Configuration 中的 VM options 添加 -Dspring.profiles.active=dev

配置文件加载位置

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/
     优先级由高到低,高优先级覆盖低优先级;互补配置,四个路径都加载
        classpath类路径,是resource文件夹
        file当前文件,是最上的文件夹

命令行指定

最优先
打包,maven->package
命令行运行java -jar xxxx.jar --spring.config.location=G:/application.properties
可以运维使用,项目已经打包时,运维时需要更改少量的配置

外部配置加载顺序

从上到下,优先级由高到低,互补配置

1. 命令行参数
2. 由jar包外向jar包内,优先加载带profile的

自动配置原理

SpringBoot有很多自动配置类来接收对应的配置。

@Conditional

判断是否满足后面的条件,如果满足则执行

技巧

在配置中写debug=true,让控制台打印自动配置报告,可以看出哪些自动配置类生效


版权声明:本文为weixin_44785069原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。