0
点赞
收藏
分享

微信扫一扫

SpringBoot yaml配置文件


目录

  • ​​yaml语法​​
  • ​​配置注入​​
  • ​​@Value 注入简单类型​​
  • ​​@ConfigurationProperties 注入相同前缀配置​​
  • ​​Spring Configuration Processor 自定义配置项提示​​
  • ​​说明​​
  • ​​区分不同环境的配置​​
  • ​​一个配置文件,通过 spring.profiles 区分​​
  • ​​多个配置文件方式,通过文件名后缀区分​​


 

yaml语法

yml配置文件的特点:简洁,层级清晰、可读性强,可以配置多种数据类型

#数值型的值,long、float不要加L、F之类的后缀
id: 1
#字符串类型的值,不引、单引、双引均可,如果值包含空格、冒号等yml预定义字符,则需要加引号
name: chy
#布尔类型
enable: false


# 数组、list、set,以下3种写法均可,英文逗号后面带不带1个空格均可,-后面带1个空格
city1: beijing,shanghai,guangzhou,shenzhen
city2: [beijing,shanghai,guangzhou,shenzhen]
city3:
- beijing
- shanghai
- guangzhou
- shenzhen


#对象、map,以下2种写法均可,放在{}中时key:后面也需要带一个空格
user1:
id: 1
name: chy
user2: {id: 1, name: chy}


#标准语法是冒号+缩进,当然,不使用缩进、直接点号分隔也行
user.id: 1
user.name: chy


#支持嵌套
user:
id: 1
name: chy
teacher: zhangsan,lisi,wangwu
socre:
chinese: 90
math: 100
english: 80

可以使用框架、组件预定义的配置项,也可以自定义配置项

 

配置注入

@Value 注入简单类型

1、@Value可以用 ${ } 取配置文件中的值,也可以使用SpEL #{ }

@Value("#{2+3}")  // #{}
private int n;

@Value("${server.port}") // ${}
private String port;

${ }、#{ } 可以用于@Value注入,也可以用在模板引擎页面中取值

 

2、会自动转换为需要的类型注入

@Configuration  //需要标识为@Component体系的组件,@Value才会被扫描、解析
public class SysConfig {

@Value("${id}") //注入普通字段
private int id;

@Value("${user.name}") //注入对象的属性值
private String username;

@Value("${city}") //注入数组
private String[] cityArr;

@Value("${city}") //注入list
private List<String> cityList;

@Value("${city}") //注入set
private Set<String> citySet;

}

 

3、可以指定默认值,未在yml中配置时会自动使用默认值

@Value("${user.name}")  //未使用:指定默认值,如果yml中未配置对应的配置项,应用启动时会直接报错
private String username;

@Value("${user.name:chy}") //使用了:指定默认值,如果yml中未配置对应的配置项,会自动使用默认值
private String username;

@Value("${user.name:Steve Jobs}") //:后面不用加一个空格,字符、字符串类型的默认值,不管是否包含空格,都不用加引号。会自动把第一个:后面的内容作为默认值,如果:后面加了空格、引号,也会被当做默认值的一部分
private String username;

@Value("${user.name:}") //加了: 但未指定具体的默认值时,默认值会取对应数据类型的默认值,引用型 => null,String => 空串
private String username;

@Value("${user.birthday:2020-01-01 00:00:00}") //日期时间类型,直接注入Date容易出错,可以注入String类型的日期时间或Long型时间戳,提供个get方法手动转换为Date
private String birthday;

 

@ConfigurationProperties 注入相同前缀配置

会自动注入与成员变量名同名的配置项

@Data  //需要提供setter方法用于注入
@Configuration //需要用@Component体系注解标注,放到容器中
@ConfigurationProperties("upload") //指定配置项前缀,value、prefix属性互为别名,都可以指定配置项前缀
public class UploadConfig {

private int maxFileSize;

private String savaDir;

//.....

}

 

Spring Configuration Processor 自定义配置项提示

在创建springboot项目时,可以勾选 Developer Tools -> Spring Configuration Processor,或手动添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

这样先使用@ConfigurationProperties编写配置类,在properties、yml中写配置时,对应的配置项会有代码提示

 

说明

1、@Value、@ConfigurationProperties 都可以和springcloud的热更新注解 @RefreshScope 搭配使用,更新yml中对应的配置项时,自动刷新对应的java字段值。
 

2、@Value、@ConfigurationProperties 都只能注入到普通的实例成员上,不能注入到 final修饰的成员上,也不能直接注入到 static 修饰的成员变量上,但可以使用实例方法的方式间接注入到static成员变量上

@Configuration
public class UploadConfig {

public static String saveDir; //不能用final修饰,不然注入不了

@Value("${upload.saveDir}") //标注在实例方法上。方法不能用static修饰,否则注入不了
public void setSaveDir(String saveDir) {
UploadConfig.saveDir = saveDir;
}

//.....

}

 

3、@Value、@ConfigurationProperties 都只能注入配置文件中的显式配置

eg. 在配置文件中显式配置了 server.port,才能注入 server.port;没在配置文件中显式配置 server.port,虽然springboot有这个配置项、也有默认值,但@Value、@ConfigurationProperties不会注入springboot自动配置指定的默认值。

 

区分不同环境的配置

一个配置文件,通过 spring.profiles 区分

独立成行的 - - - 用于分割配置,spring.profiles 指定当前配置段的名称

#各环境的公共配置
server:
port: 9000

#指定要使用的配置
spring:
profiles:
active: test


#dev环境配置
---
spring:
profiles: dev
#......


#test环境配置
---
spring:
profiles: test
#......

 

多个配置文件方式,通过文件名后缀区分

1、resources下新建配置文件,文件名格式为 application-xxx,示例

  • application-dev.yml:开发
  • application-test.yml:测试
  • application-prod.yml:生产
     

2、application.yml中指定要使用的配置文件

#各环境的公共配置

spring:
profiles:
#指定要使用的配置文件,值是application-后面的部分,可以指定多个配置文件,有多个配置文件时逗号分隔
active: dev

application.yml 中可以直接写各环境的公共配置,也可以把公共配置拆分到多个yaml中,然后在application.yml中通过 spring.profiles.include 引入。

active、include 都可以引入指定的配置文件,作用差不多,拆分为2个不同的配置项只是为了语义上的区分,好比html的布局标签<nav>、<aside>、<footer>`,本身都是<div>,效果差不多,只是语义上的区分。

 

说明

可以在执行jar包时指定配置项,命令行参数优先级最高,会覆盖application.yml中同名的配置项

java -jar xxx.jar --spring.profiles.active=dev --server.port=9000


举报

相关推荐

0 条评论