Spring Boot 全局配置文件

YAML 简介

  • Spring Boot 使用一个全局配置文件来对一些默认配置值进行修改,比如Tomcat端口等
  • 配置文件名字约定为“application.properties”或者“application.yml”
  • 配置文件放必须放在src/main/resources目录或者类路径/config下
  • yml 全称 YAML(YAML Ain't Markup Language),以数据为中心,比 json、xml 等更适合做配置文件
  • 语法规范参考网址:http://www.yaml.org
  • 如下所示使用"application.yml"来修改内置的Tomcat的端口


YAML 语法

  • k:(空格)v:表示一对键值对,注意必须有空格;
  • 使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 大小写敏感
server:
  port: 8082

数据类型

  • YAML 支持三种数据结构
  1. 对象:键值对的集合,常用写法
  2. 数组:一组按次序排列的值
  3. 字面量:单个的、不可再分的值
  4. 复合结构,以上三种写法的任意组合都可以

对象( Map )

  • k: v:在下一行来写对象的属性和值的关系;注意缩进
  • 冒号后面跟空格来分开键值;如下frined表示对象,latName与age表示属性
friend:
  lastName: zhangsan
  age: 20
  • {k: v}是行内写法,如下frined表示对象,latName与age表示属性
friend: {lastName: zhangsan,age: 18}

字面量

  • k: v:字面亮直接写,值(v)可以是“数字”、“字符串”、“布尔”、“日期”
  • 字符串默认不使用单引号或者双引号
  • ""(双引号)不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思,,如:name: "zhangsan \n lisi":输出的结果是:zhangsan 换行 lisi
  • ''(单引号)会转义字符串中的特殊字符,特殊字符最终只是一个普通的字符串数据,如:name: ‘zhangsan \n lisi’:输出结果为:zhangsan \n lisi

数组(List、Set)

  • “- 值”表示数组中的一个元素,注意缩进 和空格
Animal:
 ‐ cat
 ‐ dog
 ‐ pig
  • 行内写法
Animal: [cat,dog,pig]

YAML 文件 值注入

Java Bean


package com.lct.wmx.damain;

/**
 * Created by Administrator on 2018/7/11 0011.
 * 狗 实体类-----------普通Java Bean
 */
public class Dog {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getAge() {
        return age;
    }

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

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

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

package com.lct.wmx.damain;

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

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2018/7/11 0011.
 * 用户···实体
 *
 * @ConfigurationProperties 表示 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 * prefix = "user" 表示 将配置文件中keyuser的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中
 * 不存在"user"key,则不会为POJO注入值,属性值仍然为默认值
 * <p/>
 * @ConfigurationProperties (prefix = "user") 默认从全局配置文件中获取值然后进行注入
 * @Component 将本来标识为一个Spring 组件,因为只有是容器中的组件,容器才会为@ConfigurationProperties提供此注入功能
 */
@Component
@ConfigurationProperties(prefix = "user")
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private Date birthday;
    private List<String> colorList;
    private Map<String, String> cityMap;
    private Dog dog;

    public Integer getAge() {
        return age;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Map<String, String> getCityMap() {
        return cityMap;
    }

    public void setCityMap(Map<String, String> cityMap) {
        this.cityMap = cityMap;
    }

    public List<String> getColorList() {
        return colorList;
    }

    public void setColorList(List<String> colorList) {
        this.colorList = colorList;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", id=" + id +
                ", name='" + name + '\'' +
                ", birthday=" + birthday +
                ", colorList=" + colorList +
                ", cityMap=" + cityMap +
                ", dog=" + dog +
                '}';
    }
}
  • 写了上面的“@ConfigurationProperties(prefix = "user")”注解后,如下会提示“Spring Boot配置文件注解处理器没有找到”,这时可以点击右上角的提示“Opne Documention...”进入官方文档拷贝依赖放入到"pom.xml"文件中即可。


  • 拷贝的就是如下所示,粘贴之后刷新Maven依赖就下载好了,此时以后写yaml文件时就会有提示了,会方便很多。
    <!--导入配置文件处理器,配置文件属性值与Java Bean进行绑定时就会有提示-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

application. yml

  • 文件内容如下,key值user要与User实体类上的"@ConfigurationProperties(prefix = "user")"对应
  • 配置文件属性名要与实体类User中的一致
  • yml文件编写时要注意缩进只能是空格,且key:与value必须要用空格隔开
  • 下面基本涵盖了YAML所有的数据类型
server:
   port: 8081
user:
   id: 110
   lastName: 张三
   age: 110
   birthday: 2018/07/11
   colorList:
     - red
     - yellow
     - green
   cityMap: {mapK1: mapV1,mapK2: mapV2}
   dog:
     id: 9527
     name: 哮天犬
     age: 100

测试类 运行测试


package com.lct.wmx;

import com.lct.wmx.damain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

/**
 * SpringBoot单元测试
 * 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldQuickApplicationTests {

    /**
     * 因为User类使用了@Component注解,就是Spring一个组件,交由了Spring容器注入值
     * 所以使用@Autowired或者@ResourceDI注入在取值即可
     */
    @Resource
    private User user;

    @Test
    public void contextLoads() {
        System.out.println("------------------------------********************--------------------------------------------");
        System.out.println("======================" + user);
    }
}
  • 运行上面的测试类之后,就会看到如下输出,配置文件注入值成功
  • 注意当User的"lastName"改为"name"时,注入的时候会自动变成"Administrator",而导致自己的值无法注入,可能name是关键字吧


application. properties 文件

  • Spring Boot 约定“application.properties”与“application.yml”都是作为默认的配置文件,放在src/main/resources目录或者类路径/config下
  • “application.properties”与“application.yml” 功能完全一样,只是写法上略有不同。

properties 文件注入值

  • 现在仍然以上面的需求为例,为User实体注入值,使用application.properties来配置
  • 写法很类似Json的取值写法,都是以"."来递进的

server.port=8081

user.id=111
user.lastName=张无忌
user.age=120
user.birthday=2018/07/11
user.colorList=red,yellow,green,blacnk
user.cityMap.mapK1=mapV1
user.cityMap.mapK2=mapV2
user.dog.id=7523
user.dog.name=狗不理
user.dog.age=3

  • 对应的yml写法如下:

server:
   port: 8081
user:
   id: 110
   lastName: 张三
   age: 110
   birthday: 2018/07/11
   colorList:
     - red
     - yellow
     - green
   cityMap: {mapK1: mapV1,mapK2: mapV2}
   dog:
     id: 9527
     name: 哮天犬
     age: 100

乱码处理

  • *.properties文件中含有中文时,IDEA设置的UTF-8仍然会乱码,需要勾选后面的"本地编码转为ASCII码"即可解决


  • 注意"File Encodings"设置完成后,如果.properties文件中之前已经存在中文了,则需要删除重写







猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/80998758
今日推荐