SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入
全局配置文件
全局配置文件能够对一些默认配置值进行修改。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,不然,在控制台打印的中文内容会出现乱码的现象,具体配置如下所示:
打印测试结果:
可以看到,测试方法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)再次进行测试
可以看到,测试方法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);
} }
打印结果:
可以看到,测试方法studentTest()运行成功,同时正确打印出了Student实体类对象。
注意:本示例中只是使用@Value注解对示例中Student对象的普通类型属性进行了赋值展示,而@Value注解对于包含Map集合、对象以及YAML文件格式的行内式写法的配置文件的属性注入都不支持,如果对其赋值会报错。
SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入的更多相关文章
- MacOS下SpringBoot基础学习
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springboot"获取视频和教程资料! b站在线视 ...
- SpringBoot 基础(二)
目录 SpringBoot基础(二) 一.操作数据库 1. SpringBootJdbc 2. SpringBoot 整合 Mybatis 3. SpringBott 使用JPA 二.使用 Thyme ...
- SpringBoot基础学习(三) 自定义配置、随机数设置及参数间引用
自定义配置 SpringBoot免除了项目中大部分手动配置,可以说,几乎所有的配置都可以写在全局配置文件application.peroperties中,SpringBoot会自动加载全局配置文件从而 ...
- Yaf零基础学习总结4-Yaf的配置文件
在上一节的hello yaf当中我们已经接触过了yaf的配置文件了, Yaf和用户共用一个配置空间, 也就是在Yaf_Application初始化时刻给出的配置文件中的配置. 作为区别, Yaf的配置 ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
- Go基础学习(二)
数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...
- log4net保存到数据库系列二:独立配置文件中配置log4net
园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志一.WebConfig中配置log4net 一.WebConfig中配置log4ne ...
- springboot深入学习(一)-----springboot核心、配置文件加载、日志配置
一.@SpringBootApplication @SpringBootApplication是spring boot的核心注解,源码如下: 相当于:@Configuration+@EnableAut ...
随机推荐
- 6. Mybatis resultMap
resultMap 元素是MyBatis中最重要最强大的元素.它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那东西,而且在一些情形下允许你做一些JDBC不支持的事情.事实上,编写相似于对 ...
- Fiddler高级用法
Fiddler高级用法 1. 简单用法 Fiddler作为一个基于http协议的抓包工具,一直在业界有广泛使用.很多测试或者前端在使用Fiddler时,仅仅用于查看前端和服务端之间的请求信息.包括我作 ...
- 【ElasticSearch】ElasticSearch集群扫盲
Cluster 集群 ⼀个 Elasticsearch 集群由⼀个或多个节点(Node)组成,每个集群都有⼀个共同的集群名称作为标识. Node节点 ⼀个 Elasticsearch 实例即⼀个 ...
- hdu3768 spfa+全排列
题意: 给你一个无向图,和一些必须经过的点,问你从起点出发,到达所有必须经过的点再回来的最小总路径. 思路: 因为必须经过的点的数量很小,小于等于10,全排列是 10! = 3 ...
- CVE-2018-0798:Microsoft office 公式编辑器 Matrix record 字段栈溢出漏洞调试分析
\x01 前言 2018 年 1 月 9 日,Office 公式编辑器再曝出新漏洞,编号为 CVE-2018-0798.提起公式编辑器大家都不陌生,之前的 CVE-2017-11882 和 CVE-2 ...
- 2-9-9-12分页机制(xp)
10-10-12分页限制 10-10-12分页因为页表PEB只有四个字节所以只能访问2^32 = 4GB物理地址空间,现在的物理内存都大于4GB为了能访问到更多的物理内存2-9-9-12将PEB的大小 ...
- VS·调试过程中某个操作导致调试突然退出之解决方案
阅文时长 | 0.11分钟 字数统计 | 232字符 主要内容 | 1.引言&背景 2.声明与参考资料 『VS·调试过程中某个操作导致调试突然退出之解决方案』 编写人 | SCscHero 编 ...
- spring为何要注入接口,而注入接口的实现类就会报错
首先说明,注入的对象确实为实现类的对象.(并不是实现类的代理对象,注入并不涉及代理) 如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的AOP技术 ...
- iUploader 2.0 七牛云上传工具
iUploader 软件介绍: iUploader主要功能将文件上传至七牛云,返回 Markdown 格式的链接到剪贴板 功能介绍: 图片本地压缩 图片右键上传 图片截取上传 图片复制上传 图片拖拽上 ...
- 【Linux】Linux中在mate桌面和gnome桌面root自动登录设置
[Linux]Linux中在mate桌面和gnome桌面root自动登录设置 GLL_ 2020-03-05 11:41:40 762 收藏 1 分类专栏: Linux 文章标签: linux 版 ...