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

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

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

一,springboot配置文件:

第二章,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 语法[通俗易懂]

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

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

 


二,yaml 语法       

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

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

server:
  port: 8081
  path: /hello

另:大小写敏感

(2)值得写法

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

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

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

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

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

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

 

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

   k:v

   如:friends对象

    friends:

            name: xiaoming

             age: 20

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

数组(list、set)

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

    如  pets集合: 

        pets:

               - cat

               - dog

              - cat

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


三:yaml 语法测试

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

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

dog.java:

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

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配置文件中加入以下内容:

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 语法[通俗易懂]

(3)然后创建测试类

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

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

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做如下修改:

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包依赖:

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

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

点击下图位置:

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

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

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


四,在properties中配置

注释掉在yml中的配置。

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

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

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 语法[通俗易懂]

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

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

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

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 语法[通俗易懂]

 


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

Person.java类如下:

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 语法[通俗易懂]

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

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对象上加如下:

@Value(${person.dog})
private Dog dog;

运行测试类时就会报错。

 


 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Set集合实现有序

    Set集合实现有序今天面试问到Set集合实现有序的问题,发现集合这部分知识要补一补…. 以下所有api描述来源:https://docs.oracle.com/javase/7/docs/api/实现Set接口的类如下,其中最常见的HashSet和TreeSet。InterfaceSet&lt;E&gt;AllKnownImplementingClasses:AbstractSet, Concurren…

    2022年5月28日
    78
  • Python if用法_无内嵌的if语句

    Python if用法_无内嵌的if语句本文的主要内容是介绍Python中if语句及其使用,包括条件测试、if-else语句、if-elif-else语句以及使用if语句处理列表操作,文中附有代码以及相应的运行结果辅助理解。

    2022年9月26日
    0
  • Activity跳转到指定Fragment实例

    Activity跳转到指定Fragment实例最近做的一个项目,突然出现了这个问题,Activity中有四个fragment,分别是first,two,three,four,默认显示的是fragmenta。在开发过程中,first中跳转到另一个Activity,将这个外部Activity命名为B吧…我需要从first中跳转到B中,完成一些设置,然后再从B中的返回按钮回到three,three中也有一个viewpa

    2022年5月20日
    52
  • 面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁「建议收藏」

    面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁「建议收藏」腾讯云数据库负责人林晓斌说过:“我们面试MySQL同事时只考察两点,索引和锁”。言简意赅,MySQL锁的重要性不言而喻。本文通过同事“侨总”的一场面试,带你通俗易懂的掌握MySQL各种锁机制,希望可以帮到你!

    2022年5月1日
    33
  • 分布式拒绝服务攻击是如何实现拒绝服务的_分布式拒绝服务攻击原理是什么

    分布式拒绝服务攻击是如何实现拒绝服务的_分布式拒绝服务攻击原理是什么摘要:拒绝服务(DoS)攻击是指攻击者通过某种手段,有意地造成计算机或网络不能正常运转从而不能向合法用户提供所需要的服务或者使得服务质量降低。分布式拒绝服务(DDoS)攻击则是指处于不同位置的多个攻击者同时向一个或数个目标发起攻击,或者一个或多个攻击者控制了位于不同位置的多台机器(称为傀儡机)并利用这些机器对受害者同时实施攻击。

    2022年10月30日
    0
  • 详解Postman校验响应数据之设置断言编写Test脚本

    详解Postman校验响应数据之设置断言编写Test脚本

    2021年7月14日
    98

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号