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、会自动转换为需要的类型注入

@Data
@Component  //需要用@Component体系注解标识为spring组件放到容器中,@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方法用于注入
@Component  //需要用@Component体系注解标注为spring组件,放到容器中
@ConfigurationProperties(prefix = "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.bootgroupId>
    <artifactId>spring-boot-configuration-processorartifactId>
    <optional>trueoptional>
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、yaml配置项包含连词线写法

  • 如果@ConfigurationProperties 字段使用camel写法,会自动将配置项转换为camel写法进行注入
  • 如果@Value(“${ }”) 中使用camel写法,不会自动将配置项转换为camel写法进行注入,即找不到对应的配置项。此时如果@Value未指定默认值,启动时会直接报错,指定了默认值会自动使用默认值。

 

4、@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的布局标签

你可能感兴趣的:(SpringBoot,spring,boot,java,yaml,Value,Configuration)