前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第二章,springboot 配置,yaml 语法[通俗易懂]

第二章,springboot 配置,yaml 语法[通俗易懂]

作者头像
全栈程序员站长
发布2022-08-09 15:53:26
2570
发布2022-08-09 15:53:26
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一,springboot配置文件:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

首先看上图,我们在使用spring initializer快速创建一个项目的后,会自动生成上面的资源文件夹,••••••••

1,static

(1) 配置文件,

springboot使用一个全局的配置文件,配置文件名是固定的,有两种格式:

· application.properties

· application.yml

(2)配置文件的作用:修改springboot默认的配置,因为我们可能不满意springboot自动给我们设置的一些东西。

这里需要说一个名词:yml是YAML(先理解成是一个标记语言)语言的语言文件,以数据为中心,比json、xml更适合做配置文件,也就是要用yml替代以前用的xml文件了。

这里我们做实验,修改项目启动的服务器端口:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

和:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

看到上面的区别了吧,yml文件有会自动分层,非常简洁,而如果是xml,大量的数据都浪费在了标签上。所以说yml是以“数据为中心”。

最后重新启动就可以,看到端口号会有改变了。


二,yaml 语法

(1)k: (空格)v :表示一个键值对,空格必须有

以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。

代码语言:javascript
复制
server:
  port: 8081
  path: /hello

另:大小写敏感

(2)值得写法

字面量:普通的值(数字,字符串,布尔)

字符串不用加上单引号或双引号

“”:双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表达的意思

如: name:“zhangsan\nlisi” 就会输出:zhangsan 换号 lisi

”:单引号,会转义特殊字符,特殊字符就是普通的字符串数据

如: name:’zhangsan\nlisi’ 就会输出:zhangsan\nlisi

对象,Map(数学和值)(键值对)

k:v

如:friends对象

代码语言:javascript
复制
    friends:

            name: xiaoming

             age: 20

也可以写成行内写法:如friends: (name: xiaoming,age: 20) (注意空格)

数组(list、set)

用值表示数组中元素的一个

如 pets集合:

代码语言:javascript
复制
        pets:

               - cat

               - dog

              - cat

行内写法:pets: [cat,dog,pig]


三:yaml 语法测试

(1)创建两个实体类 (idea ,alt+insert 快捷键生成get,set方法):

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

dog.java:

代码语言:javascript
复制
package com.example.springboot.bean;

public class Dog {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

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

person.java

代码语言:javascript
复制
package com.example.springboot.bean;

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

public class Person {

    private String name;
    private Integer age;

    private Date date;

    private Dog dog;

    private Map<String,Object> maps;

    private List<Object> lists;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Dog getDog() {
        return dog;
    }

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

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

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

(2)然后在application.yml配置文件中加入以下内容:

代码语言:javascript
复制
server:
  port: 8081
  path: /hello

person:
    name: zhangsan
    age: 20
    date: 2019/02/29
    maps: {k1: v1,k2: v2}
    lists:
      - lisi
      - zhaoliu
    dog:
      name: xiaogou
      age: 2
第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

(3)然后创建测试类

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

在这个目录下,有自动创建好的测试类,我做如下修改:

代码语言:javascript
复制
package com.example.springboot;

import com.example.springboot.bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
 * springboot的单元测试
  *可以在测试期间很方便的类似编码一样进行注入
 *
 *
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot01HelloworldQuickApplicationTests {

    @Autowired  //注入放入容器中的person类
    Person person;
    @Test
    public void contextLoads() {
        System.out.println(person);  //sout 快速打出输出语句
    }

}

上面需要把Person类注入到springboot容器中,因此要在Person.java做如下修改:

代码语言:javascript
复制
package com.example.springboot.bean;

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

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

/**
 * @ConfigurationProperties  将配置文件中配置的每个属性的值,映射到配置文件中
 * prefix = "person"  前缀,配置文件中哪个下面的所有属性进行一一映射
 *
 * 这个组件必须在容器中才能使用容器提供的ConfigurationProperties功能,所以最后再加上@Component
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private Integer age;

    private Date date;

    private Dog dog;

    private Map<String,Object> maps;

    private List<Object> lists;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Dog getDog() {
        return dog;
    }

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

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

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

这里@ConfigurationProperties会有警告提示,需要我们在pom文件的属性中增加jar包依赖:

代码语言:javascript
复制
  <!-- 导入配置文件处理器,配置文件进行导入就会有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

(4)然后就可以运行测试类了:

点击下图位置:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

最后控制台就会打印出我们在yml文件中设置的属性值了:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

四,在properties中配置

注释掉在yml中的配置。

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

然后在application.properties 中加入以下内容(ctrl+R 替换快捷键):

代码语言:javascript
复制
server.port=8089

person.name=zhangsan
person.age= 20
person.date= 2019/02/29
person.maps.k1= 13
person.maps.k2=  34
person.lists=lisi,zhaoliu,v

person.dog.name= 小狗
person.dog.age= 2

运行测试类,在控制台中显示如下:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

也能打印出来我们的值,但是发现汉字乱码了。

这里设置下idea的系统编码:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]
代码语言:javascript
复制
server.port=8089

#需要在idea中setting设置编码为utf-8
person.name=zhangsan
person.age= 20
person.date= 2019/02/29
person.maps.k1= 13
person.maps.k2=  34
person.lists=lisi,zhaoliu,v

person.dog.name= 小狗
person.dog.age= 2

然后运行,就不会乱码了:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

五,不使用 @ConfigurationProperties注解,也可以调用properties中的值

Person.java类如下:

代码语言:javascript
复制
package com.example.springboot.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

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

/**
 * @ConfigurationProperties  将配置文件中配置的每个属性的值,映射到配置文件中
 * prefix = "person"  前缀,配置文件中哪个下面的所有属性进行一一映射
 *
 * 这个组件必须在容器中才能使用容器提供的ConfigurationProperties功能,所以再加上@Component
 */
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {

    @Value("${person.name}")
    private String name;
    @Value("#{11*2}")
    private Integer age;

    private Date date;
    private Dog dog;

    private Map<String,Object> maps;

    private List<Object> lists;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Dog getDog() {
        return dog;
    }

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

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

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

运行,有以下结果:

第二章,springboot 配置,yaml 语法[通俗易懂]
第二章,springboot 配置,yaml 语法[通俗易懂]

此外,相对于@Value方式,@ConfigurationProperties,还能够加校验:

代码语言:javascript
复制
package com.example.springboot.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @ConfigurationProperties  将配置文件中配置的每个属性的值,映射到配置文件中
 * prefix = "person"  前缀,配置文件中哪个下面的所有属性进行一一映射
 *
 * 这个组件必须在容器中才能使用容器提供的ConfigurationProperties功能,所以再加上@Component
 */
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

//    @Value("${person.name}")
    @Email
    private String name;
//    @Value("#{11*2}")
    private Integer age;

    private Date date;
    private Dog dog;

    private Map<String,Object> maps;

    private List<Object> lists;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Dog getDog() {
        return dog;
    }

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

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

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

再者,@Value不支持复杂类型的注解,即如果在Dog对象上加如下:

代码语言:javascript
复制
@Value(${person.dog})
private Dog dog;

运行测试类时就会报错。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106000.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档