一,springboot配置文件:

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_java

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

1,static

    (1) 配置文件,

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

        · application.properties

       · application.yml

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

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

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

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_配置文件_02

和:

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_spring_03

看到上面的区别了吧,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方法):

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_配置文件_04

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

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_java_05

(3)然后创建测试类

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_配置文件_06

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

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)然后就可以运行测试类了:

点击下图位置:

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_java_07

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

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_配置文件_08


四,在properties中配置

注释掉在yml中的配置。

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_配置文件_09

然后在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

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

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_java_10

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

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

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_spring_11

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

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

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_java_12

 


五,不使用 @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 +
                '}';
    }
}

运行,有以下结果:

spring boot thymeleaf 改动文件不重启 springboot启动前修改yml配置_spring_13

此外,相对于@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;

运行测试类时就会报错。