文章目录

  • 配置文件的格式有哪些
  • 配置文件的加载优先级
  • yml配置格式示例Demo
  • yml知识
  • 基本语法
  • 单引号和双引号的区别
  • 行内写法
  • 引用
  • 外部传参
  • 关于错误
  • 属性值可以为空吗?
  • yaml书写格式


配置文件的格式有哪些

application.properties
以key=value键值对的形式书写

#注释
redis.ip=127.0.0.1
redis.port=6379

application.yml或application.yaml
梯级同级对齐,例如下图,ip和port同级,同属redis下的配置,则ip和port的首字母需要对其,分号(:)后需要有需要有空格(至少有1个)

#注释
redis:
 ip: 127.0.0.1
 port: 6379

配置文件的加载优先级

appliacation.properties>appliacation.yml>application.yaml
相同配置参数,优先级高的生效。

yml配置格式示例Demo

例子表示获取yml配置文件的的三种方式

  • @Value注解
  • Environment
  • 对象注入

如下为三种获取方式
application.yml

server:
  port: 8800
name: abc

person:
  name: hello
  age: 88
  addr:
    - bj
    - wh
address:
  - wuhan
  - shanghai
#数组行内写法
address2: [bj,wh]

Person.java

package com.it2.springboothello02.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;

    private  int age;

    private String[] addr;

    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String[] getAddr() {
        return addr;
    }

    public void setAddr(String[] addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

HelloController.java

package com.it2.springboothello02.controller;

import com.it2.springboothello02.bean.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;

/**
 * yml参数的注入方式
 */
@RestController
public class HelloController {

    /**
     *第一种@Value(${key})
     */
    @Value("${name}")
    private String name;

    @Value("${}")
    private String name2;

    @Value("${address[0]}")
    private String city;


    /**
     * 第二种Environment
     */
    @Autowired
    private Environment env;

    /**
     * 第三种对象注入
     */
    @Autowired
    private Person person;

    @RequestMapping("/hello")
    public String hello(){
        return "hello spring init";
    }

    @RequestMapping("/hello2")
    public String hello2(){
        System.out.println("============第一种输出结果(@Value)===========");
        System.out.println(name);
        System.out.println(name2);
        System.out.println(city);
        System.out.println("============第二种输出结果(Environment)============");
        System.out.println(env.getProperty("name"));
        System.out.println(env.getProperty(""));
        System.out.println(env.getProperty("address[0]"));
        System.out.println("============第三种输出结果(对象)============");
        System.out.println(person);
        System.out.println(Arrays.toString(person.getAddr()));

        return "hello spring init 222";
    }

}

运行结果:

redis yml 配置 yml文件配置redis_System

yml知识

基本语法

  • 大小写敏感
  • 数值前必须要有空格
  • 使用空格缩进来表示层级关系(不要使用tab来缩进,不同系统的tab表达不一样)

单引号和双引号的区别

#单引号和双引号的区别
msg: 'hello \n world' #原样输出,不识别转移字符
msg2: "hello \n world" # 换行输出

行内写法

##########对象############
redis:
 ip: 127.0.0.1
 port: 6379
 
#yml行内写法(比较少见),行内写法在分号后面同样需要空格
redis2: {ip: 127.0.0.1,port: 6379}

###########数组##########
#常规写法
address:
  - wuhan
  - shanghai
#数组行内写法
address2: [wuhan,shanghai]

引用

name: hello
name2: ${name} #引用前面的name

外部传参

redis:
 ip: ${REDIS_HOST:127.0.0.1}
 port: ${REDIS_PORT:6379}

如果外部定义了REDIS_HOST和REDIS_PORT,则使用传入值,否则使用配置值(127.0.0.1和6379)。


关于错误

属性值可以为空吗?

  • @Value:不挑选配置格式,允许变量值为空,但是变量名必须在配置中定义。
  • Environment:不挑选配置格式,允许变量值为空,也允许变量名为空。
  • 对象:不允许变量值为空(当然变量名更不允许为空),但是对象的数组变量可以空(内容可以空,长度不能为0)。

@Value注解和Environment支持各种格式,允许属性值为空,它们支持各种格式。

yaml格式值为null,需要使用~(波浪线)

a: ~ #a=null

redis yml 配置 yml文件配置redis_spring_02


redis yml 配置 yml文件配置redis_java_03


redis yml 配置 yml文件配置redis_spring boot_04

但是变量名必须在配置文件中声明,否则将无法运行。(如下图变量名name3没有在配置文件中声明)

redis yml 配置 yml文件配置redis_spring boot_05

对象注入,对象的属性不能为空。

错误的操作

redis yml 配置 yml文件配置redis_java_06


正确的操作(当然我们不能这么配置)

redis yml 配置 yml文件配置redis_java_07

yaml书写格式

boolean: TRUE       #true/false,True/False,TRUE/FALSE
float: 3.14         #支持科学计数法,如1.88979222e+5
int: 1              #支持二进制、八进制、十六进制
null: ~             #使用~表示null
string: hello       #字符串可以直接书写
string2: "a b"      #可以使用双引号包括字符串
date: 2022-06-07    # 日期必须使用yyyy-MM-dd格式

#日期和时间之间需要使用T连接,最后使用+表示时区
datetime: 2022-06-07T12:00:00+08:00