第二章,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;

运行测试类时就会报错。

 


 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JavaMD5加密「建议收藏」

    JavaMD5加密「建议收藏」Java实现MD5加密什么是MD5:MD5信息摘要算法(英语:MD5Message-DigestAlgorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。使用方法:1、引入maven坐标,导入相应的包在pom.xml中引入包的坐标<dependency> <groupId>commons-codec</groupId> <artifactI

  • python 安装第三方包-安装失败(pycharm/ anaconda navigator)

    python 安装第三方包-安装失败(pycharm/ anaconda navigator)安装/卸载第三包:方法一:pipinstall包名;pipuninstall包名。方法二:pipinstall下载路径\包名.whl(需要先下载第三包:地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/,找到所需的包并下载保存),如下例安装gensim包所示:方法三:若在pycharm编辑中,则在菜单setting/project…

  • jboss下载和安装[通俗易懂]

    jboss下载和安装[通俗易懂]1.下载http://www.jboss.org/jbossas/downloads/选择CertifiedJavaEE6FullProfile版本,我下载的是jboss-as-7.1.1.Final.zip。2.解压jboss-as-7.1.1.Final.zip注意整个路径必须没有空格才行。3.配置环境变量JRE环境变量JAVA_HOME…

  • vue监听点击事件_vue reload

    vue监听点击事件_vue reload运用的知识点:JavaScript的onbeforeunload函数使用方法window.onbeforeunload=function(){  return‘’;}注意:有返回值(”,true,false…都可以)才能弹出显示,或者有需要执行的事件也行。onload、onunload、onbeforeunload的执行问题:页面加载…

    2022年10月16日
  • CurrentHashMap的实现原理

    CurrentHashMap的实现原理hash表介绍哈希表就是一种以键-值(key-indexed)存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。链式hash表链式哈希表从根本上说是由一组链表…

  • Swift 通过touchesBegan 方法获取用户点击的view,模拟连续点击效果[通俗易懂]

    Swift 通过touchesBegan 方法获取用户点击的view,模拟连续点击效果[通俗易懂]一:代码实现varmV:UIView! varflag=falseoverridefuncviewDidLoad(){super.viewDidLoad()mV=UIView(frame:CGRect(x:100,y:100,width:100,height:100…

发表回复

您的电子邮箱地址不会被公开。

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