SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

时间:2022-09-05 19:52:08

全局配置文件

全局配置文件能够对一些默认配置值进行修改。SpringBoot 使用一个名为 application.properties 或者 application.yaml的文件作为全局配置文件,该文件会放在 src/main/resource 目录或者类路径的 /config 目录下,一般会选择 /resource。下面将讲解这两种配置文件:

(1)application.properties配置文件

使用Spring Initializr方式构建的SpringBoot项目会自动在 src/main/resource 目录下生成一个 application.properties 配置文件,SpringBoot项目启动时会自动加载 application.properties 配置文件。

我们可以在 application.properties 配置文件中定义SpringBoot项目的相关属性,包括系统属性、环境变量及命令参数等信息,也可以是自定义配置文件名称和位置,如下所示:

server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.config.additional-location=
spring.config.location=
spring.config.name=application

接下来,通过一个简单案例对SpringBoot项目中 application.properties 配置文件的使用进行讲解。

操作步骤:

1、先在项目的 com.hardy.springboot_demo 包下创建一个pojo包,并在该包下创建两个实体类 Pet和Person:

package com.hardy.springboot_demo.pojo;

/**
* @Author: HardyYao
* @Date: 2021/5/30
*/
public class Pet { private String type; private String name; public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Pet{" +
"type='" + type + '\'' +
", name='" + name + '\'' +
'}';
}
}
package com.hardy.springboot_demo.pojo;

/**
* @Author: HardyYao
* @Date: 2021/5/30
*/ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import java.util.Arrays;
import java.util.List;
import java.util.Map; @Component // 用于将Person类作为Bean注入到Spring容器中
@ConfigurationProperties(prefix = "person") // 将配置文件中以person开头的属性注入到该类中
public class Person { private int id; // id private String name; // 姓名 private List hobby; // 爱好 private String[] family; // 家庭成员 private Map map; private Pet pet; // 宠物 public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List getHobby() {
return hobby;
} public void setHobby(List hobby) {
this.hobby = hobby;
} public String[] getFamily() {
return family;
} public void setFamily(String[] family) {
this.family = family;
} public Map getMap() {
return map;
} public void setMap(Map map) {
this.map = map;
} public Pet getPet() {
return pet;
} public void setPet(Pet pet) {
this.pet = pet;
} @Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", hobby=" + hobby +
", family=" + Arrays.toString(family) +
", map=" + map +
", pet=" + pet +
'}';
}
}

@ConfigurationProperties(prefix = "person") 注解的作用是将配置文件中以person开头的属性值通过setXX()方法注入到实体类对应属性中。

@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样才能被@ConfigurationProperties注解进行赋值。

2、编写项目的 application.properties 配置文件,在该配置文件中编写需要对Person类设置的配置属性:

person.id=1
person.name=hardy
person.hobby=吃肉,看书,学习,写代码
person.family=爸爸,妈妈
person.map.k1=v1
person.map.k2=v2
person.pet.type=cat
person.pet.name=Hello Kitty

编写 application.properties 配置文件时,由于要配置为Person对象属性值是我们自己定义的,SpringBoot无法自动识别,所以不会有书写提示。在实际开发中,为了出现代码提示来提高配置效率,我们可以使用@ConfigurationProperties注解进行配置文件属性值注入,这需要在pom.xml文件中添加一个SpringBoot提供的配置器依赖:

<!-- 引入配置器依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

添加上述依赖后,需要重新运行项目启动类或者使用“Ctrl+F9”快捷键(即Build Project)重构当前SpringBoot项目即可。

3、在项目测试类中引入Person实体类Bean,进行测试:

package com.hardy.springboot_demo;

import com.hardy.springboot_demo.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest // 标记为SpringBoot单元测试类,并加载项目的ApplicationContext上下文环境
class SpringbootDemoApplicationTests { @Autowired
private Person person; @Test
void configurationTest() {
System.out.println(person);
} }

注意:这里需要对IDEA进行一下编码设置,设置为UTF-8,不然,在控制台打印的中文内容会出现乱码的现象,具体配置如下所示:

SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

打印测试结果:

SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

可以看到,测试方法configurationTest()运行成功,也打印出了Person实体类对象。说明我们的 application.properties 配置文件配置正确,并通过相关注解自动完成了属性注入。

(2)application.yaml配置文件

YAML文件格式是SpringBoot支持的一种用于编写配置文件的序列化语言,它与JSON有些相似,被称为JSON的超集。YAML的设计是为了友好可读性,主要用于配置信息的编写,而JSON的设计目的则是为了简单和通用,主要用于存储数据和应用层数据通信使用。

application.yaml 配置文件的工作原理和 application.properties 配置文件是相同的,只不过 application.yaml 配置文件看起来更简洁一些。

  • YAML文件的拓展名可以用.yml或这.yaml。
  • application.yml文件使用“key: value”(注意,中间要有一个空格)格式配置属性,使用缩进控制层级关系。

这里,针对不同数据类型的属性值,介绍一下YAML。

1、value值为普通数据类型(例如数字、字符串、布尔等)

当YAML配置文件中配置的属性值为普通数据类型时,可以直接配置对应的属性值,同时对于字符串类型的属性值,不需要额外添加引号,示例代码如下:

server:
port: 8080
path: /demo

上述代码用于配置server的port和path属性,port和path属于同一个级别。

2、value值为数组和单列集合

当YAML配置文件中配置的属性值为数据或单列集合类型时,主要有两种编写方式:缩进式写法和行内式写法。

其中,缩进式写法还有两种表现形式,示例代码如下:

person:
hobby:
- eat
- read
- study
- coding

或者使用如下方式:

person:
hobby:
eat,
read,
study,
coding

上述代码中,在YAML配置文件中通过两种缩进式写法对person对象的单列集合(或数组)类型的hobby赋值为eat,read,study和coding。其中一种形式为“- 属性值”(注意,中间要有一个空格),另一种形式为多个属性值之间用逗号隔开(注意,最后一个属性值后面不能加逗号)。

行内式写法如下:

person:
hobby: [eat,read,study,coding]

通过上述代码对比发现,YAML配置文件的行内式写法更加简洁和方便。此外,包含属性值的中括号“[]”还可以进一步省略,在进行属性赋值时,程序会自动匹配和校对。

3、value值为Map集合与对象

当YAML配置文件中配置的属性值为Map集合或对象类型时,YAML配置文件同样可以分为两种书写方式:缩进式写法和行内式写法。

其中,缩进式写法的示例代码如下:

person:
map:
k1: v1
k2: v2

对应的行内式写法如下:

person:
map: {k1: v1,k2: v2}

在YAML配置文件中,配置的属性值为Map集合或对象类型时,缩进式写法的形式按照YAML文件格式常规写法编写即可,而行内式写法的属性值要用大括号“{}”包含。

接下来,在Properties配置文件演示案例的基础上,通过配置 application.yaml配置文件 对Person对象进行赋值,具体使用如下:

(1)在项目的resources目录下,新建一个 application.yaml配置文件,在该配置文件中编写Person类的配置属性:

# 对实体类对象Person进行属性配置
person:
id: 1
name: hardy
hobby: [吃肉,读书,学习,写代码]
family: [爸爸,妈妈]
map: {k1: v1,k2: v2}
pet: {type: cat,name: Hello Kitty}

注意:本次使用 application.yaml配置文件 进行测试时需要先将 application.properties配置文件 中编写的配置给注释掉,不然的话 application.properties配置文件 会覆盖掉 application.yaml配置文件 中的配置。

(2)再次进行测试

SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

可以看到,测试方法configurationTest()同样运行成功,并正确打印出了Person实体类对象。

配置文件属性值的注入

使用SpringBoot全局配置文件设置属性时:

  • 如果配置属性是SpringBoot已有属性,例如服务端口server.port,那么SpringBoot内部会自动扫描、读取这些配置文件中的属性值并覆盖默认属性
  • 如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配置属性方可生效

SpringBoot支持多种注入配置文件属性的方式,下面来介绍如何使用注解@ConfigurationProperties和@Value注入属性。

(1)使用@ConfigurationProperties注入属性

SpringBoot提供@ConfigurationProperties注解用于快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。假设现在有一个配置文件,如果使用@ConfigurationProperties诸如配置文件的属性,示例代码如下:

@Component // 用于将Person类作为Bean注入到Spring容器中
@ConfigurationProperties(prefix = "person") // 将配置文件中以person开头的属性注入到该类中
public class Person { private int id; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} }

上述代码使用@Component和@ConfigurationProperties(prefix = “person”)将配置文件中的每个属性都映射到person类组件中。

(2)使用@Value注入属性

@Value注解是Spring框架提供的,用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中,SpringBoot框架从Spring框架中对@Value进行了默认继承,所以在SpringBoot框架中还可以使用该注解读取和注入配置文件属性值。使用@Value注入属性的示例代码如下:

@Component
public class Person { @Value("${person.id}")
private int id; }

在上述代码中,使用@Component和@Value注入Person实体类的id属性。其中@Value不仅可以将配置文件的属性注入Person的id属性,还可以直接给id属性进行赋值,这点是@ConfigurationProperties不支持的。

演示@Value注解读取并注入配置文件属性的使用:

(1)在项目的 com.hardy.springboot_demo.pojo 包下创建一个实体类 Student,并使用@Value注解注入属性:

package com.hardy.springboot_demo.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; /**
* @Author: HardyYao
* @Date: 2021/5/30
*/
@Component
public class Student { @Value("${person.id}")
private int id;
@Value("${person.name}")
private String name; // 名称 // 不需要set方法 @Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

Student类使用@Value注解将配置文件的属性值读取和注入。

从上述代码可以看出,使用@Value注解方式需要对每一个属性进行注入设置,同时又免去了属性的setXXX()方法。

(2)再次编写测试方法进行测试

package com.hardy.springboot_demo;

import com.hardy.springboot_demo.pojo.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest // 标记为SpringBoot单元测试类,并加载项目的ApplicationContext上下文环境
class SpringbootDemoApplicationTests { @Autowired
private Student student; @Test
void studentTest() {
System.out.println(student);
} }

打印结果:

SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

可以看到,测试方法studentTest()运行成功,同时正确打印出了Student实体类对象。

注意:本示例中只是使用@Value注解对示例中Student对象的普通类型属性进行了赋值展示,而@Value注解对于包含Map集合、对象以及YAML文件格式的行内式写法的配置文件的属性注入都不支持,如果对其赋值会报错。

SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入的更多相关文章

  1. MacOS下SpringBoot基础学习

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springboot"获取视频和教程资料! b站在线视 ...

  2. SpringBoot 基础(二)

    目录 SpringBoot基础(二) 一.操作数据库 1. SpringBootJdbc 2. SpringBoot 整合 Mybatis 3. SpringBott 使用JPA 二.使用 Thyme ...

  3. SpringBoot基础学习(三) 自定义配置、随机数设置及参数间引用

    自定义配置 SpringBoot免除了项目中大部分手动配置,可以说,几乎所有的配置都可以写在全局配置文件application.peroperties中,SpringBoot会自动加载全局配置文件从而 ...

  4. Yaf零基础学习总结4-Yaf的配置文件

    在上一节的hello yaf当中我们已经接触过了yaf的配置文件了, Yaf和用户共用一个配置空间, 也就是在Yaf_Application初始化时刻给出的配置文件中的配置. 作为区别, Yaf的配置 ...

  5. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  6. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  7. Go基础学习&lpar;二&rpar;

    数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: &quot ...

  8. log4net保存到数据库系列二:独立配置文件中配置log4net

    园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志一.WebConfig中配置log4net 一.WebConfig中配置log4ne ...

  9. springboot深入学习&lpar;一&rpar;-----springboot核心、配置文件加载、日志配置

    一.@SpringBootApplication @SpringBootApplication是spring boot的核心注解,源码如下: 相当于:@Configuration+@EnableAut ...

随机推荐

  1. Linux CentOS 中安装 MySql

    CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 $ wget http://repo.mysql.com ...

  2. WebForm——IIS服务器、开发方式和简单基础

    一.B/S和C/S 1.C/S C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据 ...

  3. 初步认识ajax(个人整理)

    通过使用ajax可以实现页面的部分动态化 ajax可以发送一个请求去服务端,而服务端则发送回一小段数据给客户端,这样就可以避免加载整个页面,因为很多时候页面只需要刷新某一部分的数据,而其他大部分体就不 ...

  4. php中的字符串常用函数&lpar;四&rpar; ord&lpar;&rpar; 获得字符的ascii码 chr&lpar;&rpar;获取ascii码对应的字符

    ord('a');//=>97 返回小写a 的ascii码值97 chr(97);//=>a 返回ascii码表上的97对应的 小写a

  5. Redis 代理 twemproxy

    4台 redis 服务器 172.16.1.37:6379   - 1 172.16.1.36:6379   - 2 172.16.1.35:6379   - 3 172.16.1.34:6379   ...

  6. PHP学习笔记 01 之表单传值

    一.HTML传值/PHP接收方法 1.GET(地址栏+问号+数据信息) (1)方式一:表单Form: method = 'get' GET接收数据方式: $_GET['表单元素name对应的值] (2 ...

  7. 在Git中设置自己的姓名

    在Git中,自己的姓名与每一个commit提交绑定在一起.如果你在使用Azure DevOps Server中的Git Repo时,一定要注意commit中的提交者与服务器上的推送者,是两个概念. 在 ...

  8. bitcoin源码解析 - 交易 Transcation &lpar;一&rpar;

    比特币中的交易可谓是比特币的最核心部分.比特币由交易产生,而区块就是用来存储交易的.所以,交易是比特币存在的载体,同时也是比特币中最复杂的部分.交易的运作层层相扣,各个部分缺一不可,十分严密,由此体现 ...

  9. how2j网站前端项目——天猫前端(第一次)学习笔记8

    其他页面的学习 这些页面有1.查询结果页 2.支付页面 3.支付成功页面 4.确认收货页面上 5.确认收货页面下 6.收获成功页面 7.评价页面上 8.评价页面下 9.登陆页面 10.注册页面 1.查 ...

  10. 关于p标签

    说p标签是不能嵌套div和p的,嵌套会被浏览器解析分离.但如果你使用了document.createElement创建div,再appendChild的话反而可以了.看来浏览器并不支持动态解析