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.sql.jdbc.Driver
接下来,通过⼀个简单案例对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) {
}
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.t.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
springboot框架的作用
@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=" + String(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
pe=cat
person.pet.name=Hello Kitty
编写 application.properties 配置⽂件时,由于要配置为Person对象属性值是我们⾃⼰定义的,SpringBoot⽆法⾃动识别,所以不会有书写提⽰。在实际开发中,为了出现代码提⽰来提⾼配置效率,我们可以使⽤@ConfigurationProperties注解进⾏配置⽂件属性值注⼊,这需要在l⽂件中添加⼀个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.st.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。
这⾥,针对不同数据类型的属性值,介绍⼀下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注解将配置⽂件的属性值读取和注⼊。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论