(Spring Boot教程三 )关于配置文件application.properties和application.yml理解

    之前我们使用的方法是通过IDEA中的maven创建方式进行Spring Boot项目搭建,主要是希望能够通过手动加入必要的依赖,让初学者对于Spring Boot项目中的依赖应用有一个更深入的了解。其实,我们还可以更加快速地搭建Spring Boot项目,只需要使用IDEA中的Spring Initializr创建项就可以,详见Windows下IntelliJ IDEA搭建Spring Boot的简单项目——超详细图解

目录

一、基础介绍

二、YAML语法和.properties文件语法

三、项目实践

四、项目中出现的错误、原因及解决办法


一、基础介绍

     Spring Boot中使用全局配置文件对项目的默认配置进行修改,比如设置端口号。通常路径为“src->main->resources->application.properties”,如果你的项目是使用Spring Initializr创建项进行创建,那么路径就一定是这个。一般情况下,项目可以有多个配置文件,Spring Boot项目会把resources下的".properties"和".yml"文件读入进行配置。

    但是,“.properties”文件的语法写起来有很多重复,所以这里推荐在这里将“application.properties”替换成“application.yml”。“.yml”文件时YAML语言,这个语言以数据为中心,更加容易编写,更适合作为配置文件。二者的语法都不难理解,这篇博客中会介绍到这两种语法。

    以往我们主要使用.xml文件作为配置文件,下面我们来对比一下这三种文件在配置端口号上有什么语法上的不同,我们将端口号从默认的8080改成8081。

(1)xml文件,代码如下:

<server>
    <port>8081</port>
</server>

(2)properties文件,代码如下:

server.port=8081

(3)yml文件,代码如下:

server:
    port: 8081

    可以看出xml的确在配置上需要更多的代码。有的同学看到这里觉得,.properties貌似比.yml更简练,但是如果在对server的多个属性进行配置时,yml差异就体现出来了。

二、YAML语法和.properties文件语法

1、YAML基本语法:基本有3点

(1)采用“key: value”的键值对形式进行设置,注意“:”和“value”之间必须使用空格隔开

(2)使用缩进表示层级关系,缩进使用空格而非TAB。空格多少无所谓,相同层级需要左对齐

(3)属性和值的大小写敏感

    其实我们使用IDEA的时候,第一点,如果你没有在value前设置空格,关键字就是普通的黑色或者灰色,使用空格之后,就会变成关键字的橙色。第二点IDEA都会帮你完成,它会自动帮你缩进,并通过空格设置缩进的大小,通常使用两个空格。只需要注意自己在编写代码的时候会不会不小心删除空格就可以了。

2、YAML值的写法,也就是我们value都可以填什么类型的变量

(1)字面量:数字、字符串、布尔。通常数字直接写就可以,布尔类型需要小写(true/false),字符串使用单引号或者双引号。如果使用单引号,输出特殊字符时不会转义,比如,'\n'输出的内容就是\n;而双引号则会转义,“\n”输出的内容就是一个回车。

(2)对象、Map:键值对。对象仍然使用“key: value”键值对的方式进行值的录入,对象可作为某个key的value。这样说有点不方便理解,我们可以通过一个例子来更加形象地看出来。我们表示一个student类型,有两种写法,一种多行的,一种是行内的。行内写法需要用大括号括起来。

#多行写法
student:
  name: "Li Ming"
  age: 18
#单行的行内写法
student: {name: "Li Ming",age: 18}

(3)数组:List、Set。与对象相似,同样有单行和多行的写法,多行用“- 值”的形式来表示数组中的一个元素,注意,值前同样有一个空格;单行写法不用“-”,使用中括号将所有值括起来,值之间使用“,”隔开。仍然举个例子。

#多行写法
person: 
  - man
  - women
#单行的行内写法
person: [man,women]

3、.properties语法:.properties文件的编码是ISO-8859-1,又称为Latin-1。从语法上来讲,有前面的yaml语法作为基础知识,这里就更容易理解。我们先在下面列出代码,可以看出这里使用“=”进行对“类.变量”赋值,赋值内容与yml一样,都包括字面量、数组、对象。对于字面量中的字符串规则与yml一样;而数组,我们这里不需要使用“[]”,直接使用英文逗号隔开就可以;对象也可以作为类的一个变量,同样使用“.”将对象与对象里的变量隔开。

student.name=zg
student.isfemale=true
student.birth=2014/4/1
student.teachers=Zhang, Liu
student.grade.English=89
student.grade.Math=100
student.pets.age=2
student.pets.spices=dog

4、当有多个配置文件时

(1).yml文件:.yml配置文件可以在四个位置,这里以application.yml为例。如下,按照优先级由高到低进行展示。也就是如果下面的四个文件夹分别有四个application.yml,其中都对一个bean的一个变量进行配置,系统会使用“项目主目录->config->application.yml”内的数据。

  • 项目主目录->config->application.yml
  • 项目主目录->src->application.yml
  • 项目主目录->src->main->resources->config->application.yml
  • 项目主目录->src->main->resources->application.yml

   当我们需要在同一路径下有多个YAML文件进行配置,那么YAML文件的名字必须以“application”开头,并以“-”进行连接,比如“application-student.yml”。并且我们需要在application.yml中对其他YAML文件进行声明,这样Spring Boot就知道我们要使用的YAML文件是什么了。如果这类的配置文件与主配置文件applicaiton.yml产生冲突,以当前文件内容优先。

   声明的代码:

spring:
  profiles:
    include: student

(2).properties文件:与YAML文件相似,我们在一个项目中可以有多个.properties文件,但名字没有限制。我们需要在类文件中类名前使用@PropertySource进行注解。举个例子如果我们定义一个“student.properties”专门用于配置student的一些内容,那么在Student.java里我们需要加上注解,如下

//找到所有配置文件中以"student"开头的内容进行配置
@ConfigurationProperties(prefix="student")
@PropertySource(value = {"classpath:student.properties"})
public class Student {

   @PropertySource可以帮助我们使用多个额外的.properties配置文件,具体的细节,请大家在我们的Spring Boot教程四中查看。

(3)如果赋值的内容需要随机数或者需要其他项的值,我们可以使用“${}”来获取,比如下面的代码为pets的age赋值一个随机整数,并将teacher数组中的第一个值“zhang”放到pet的spices属性中。

student:
  birth: 2019/04/11
  teachers: [zhang,wang]
  grade: {English: 87, Math: 100}
  pets:
    spices: ${student.teachers[0]}-dog
    age: ${random.int}

   random可以调用的方法以及他们的解释有如下的几种,基本上都是看到名字就能够猜到他们是做什么的:

  • random.int:随机生成整数
  • random.int(value,max):在指定范围随机生成整数
  • random.long:随机生成long型整数
  • random.long(value,max):在指定范围随机生成long型整数
  • random.uuid:随机生成128位uuid随机码
  • random.value:随机生成一个长度为32的数字和小写字母组成的一个字符串。

三、项目实践

    下面我们将通过构建一个项目,来看一下Spring Boot如何在配置文件中自动为Bean的属性配置值。

1、首先我们需要快速构建一个Spring Boot项目。如果有的同学对这部分很熟,请跳过。

(1)新建项目,选择Spring Initializr,确认项目的SDK是不是本地的你为你的电脑配置的SDK。

(2)输入Group和Artifact名字

(3)选择模板进行添加,我们添加web模板

(4)删除项目中不用的多余的项,使项目结构更加地整洁。

(5)我们在项目中添加application.yml文件,打开src->main->resources目录,右键点击resources->new->File,输入“application.yml”添加新的配置文件。这里可以不用把application.properties文件删除,因为之后我们还将通过项目对这两个文件进行相同操作从而进行对比。

(6)注意IDEA右下角的提示,选择自动配置:

2、构建bean;在com.springboot.application下面新建一个bean文件夹,同时在这个文件夹下建立两个类文件:Pet和Student。

(1)新建目录和Pet可以同时进行,如下。

   

(2)然后新建Student。

(3)为Pet.java和Student.java添加内容。先按照下面代码为Pet.java填充变量,然后自动填充get()、set()、toString()函数。方法是在代码上右键->Generate->Getter and Setter和右键->Generate->toString

public class Pet {
    private String spices;
    private Integer age;
}

    同样的方法,我们为Student.java添加内容,因为我们要通过这个文件比较全面地展示各种变量的使用,所以我们这里设置的变量的类型多一点,没有过多考虑是否符合实际需求。代码如下,代码填充结束后我们还是通过IDEA自动填充get()、set()、toString()函数。

public class Student {
    private String name;
    private Boolean isfemale;
    private Date birth;

    private List<Object> teachers;
    private Map<String, Object> grade;
    
    private Pet pets;

}

(3)对全局配置文件application.yml内容进行填充。内容如下,注意空格,注意大小写。

student:
  name: zg
  isfemale: true
  birth: 2019/04/12
  teachers: [zhang teacher,wang teacher]
  grade: {English: 87, Math: 100}
  pets:
    spices: Dog
    age: 1

    如果你使用的是application.properties,则内容如下。

student.name=zg
student.isfemale=true
student.birth=2014/4/1
student.teachers=Zhang, Liu
student.grade.English=89
student.grade.Math=100
student.pets.age=2
student.pets.spices=dog

(4)为Student.java添加配置属性注解“@ConfigurationProperties(prefix = "student")”完成自动配置。这个注解主要是将配置文件中的数据与被注解的类的属性进行绑定,“prefix”参数主要是用来定位配置文件中的数据的,这样我们就可以知道,Student.java需要绑定的数据在配置文件中是以“Student”开头的位置。

    这里我图片写的“Student”,而文字教程中是“student”,以文字教程为主。如果使用“Student”,IDEA标红报错,详细的错误解释即解决办法等在教程末尾的错误修改1中。

    但是添加完,我们发现注解报红。这是因为我们没有做相关引入和包的配置。

   首先,我们将鼠标放在上面,IDEA提示你按“Alt+Enter”,然后我们就能引入所提示的包。注意

(a)你的包可能因为一些版本的原因包名与我不同,但是,基本的操作相同。

(b)可能你“Alt+Enter”之后不会引入包,会提示你几个选择,选择“maven”开头的那个,大概位置在第三个左右。然后你会进入一个包选择的界面,选择org.springframework的那个就可以了,具体我的全部配置文件见图。

   但是我们的问题依然没有解决,IDEA为我们又进行提示,如下。大概就是类路径下找不到注解。原因很简单,我们没有在pom文件中进行依赖注入,所以Spring Boot没有自动下载这个包,当然找不到。怎么注入?当然是操作pom文件。在pom文件中加入什么?我们点开IDEA提示的文档,选择下图中的“Open Documentation”

    打开后的界面如下:

    我们将“dependency”的内容复制一下,粘贴到项目中的<dependencies>下,然后就可以了。

    这个时候依然会有问题,报错“Not registered via @EnableConfiguration Properties or marked as Spring component”,这是什么意思呢?说明我们的这个@ConfigurationProperties注解只能注解Spring组件。知道问题在哪里就好解决了,我们上一篇博客里讲解注解的时候讲到一个注解是专门用来注册组件的,是什么?是@Component!答对了,我们只需要在Student前面加上注解@Component就可以啦!至于@Component在哪个包里,前面我已经把所有包都列出来了,大家可以在那里看一下。

    好了,现在没有问题了。我们可以run一下主配置类,我这里是application.java,发现没有任何问题。

3、Test测试。打开“test->java->com.springboot.application->ApplicationTests”,我们为其添加内容,使其如下面的代码。其中,@AutoWired会帮助我们的变量与配置文件中的内容进行自动匹配。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    @Autowired
    Student student;

    @Test
    public void contextLoads() {
        System.out.println(student);
    }

}

    然后我们再Application Tests上右键启动一下测试类

    执行结果如下:

四、项目中出现的错误、原因及解决办法

1、@ConfigurationProperties(prefix="student")报错“Prefix must be in canonical form”,因为我们这里prefix的参数必须使用驼峰命名法,全部小写,单词之间使用短横线连接,把“Student”改成“student”就可以了。

2、在使用配置文件为类注入值的时候,有的变量值没有注入成功,显示的为null。如下:

问题原因还是在于命名,一开始我的配置文件和类变量设置如下:

   

首先,我们可以看到“isFEmale”后面的“false”没有变成黄色,如果我们对应成功了,这里的false是关键字,应该变色。如果我们把变量都改成小写的,问题就可以解决了。

3、中文乱码:在使用application.properties进行配置的时候,如果配置的内容中有中文字符串会出现乱码的现象,具体的解决方法,请参考:使用application.properties配置文件造成的汉字乱码问题解决

猜你喜欢

转载自blog.csdn.net/zhanggonglalala/article/details/89231025