SpringBoot 配置文件给实体注入值方式

网友投稿 431 2022-08-27


SpringBoot 配置文件给实体注入值方式

目录配置文件给实体注入值properties用法yaml用法通过配置文件给实体类注入属性上面yml中注意也可以使用properties注入配置文件值注入方式1.1 从全局配置文件中读取配置到实体类 (@ConfigurationProperties)1.2 全局配置文件注入值(@Value)1.3 从指定文件读取并配置实体类(@PropertySource+@ConfigurationProperties)1.4 从指定文件读取并注入值(@PropertySource+@Value)

配置文件给实体注入值

SpringBoot 默认的全局配置文件有两个 application.properties 和application.yml

properties用法

# 例如修改端口号 直接赋值

server.port=8888

yaml用法

# 例如修改端口号

server:

port: 8888

YML中赋值是以键值对的形式,且利用缩进表示层级关系,同一级缩进必须一致大小写敏感,支持松散写法,且冒号后面必须有一个空格

通过配置文件给实体类注入属性

// 实体类

@Component // 把实体类放入到spring容器中

@ConfigurationProperties(prefix = "student") // 识别配置文件

public class Student {

private String name;

private int age;

private boolean sex;

private Date birthday;

private Map location;

private String[] hobbies;

private List skills;

private Pet pet;

// .... set/get/toString

}

# yml 配置文件

student:

name: zs

age: 23

sex: true

birthday: 2020/10/1

location: {province: 湖北,city: 武汉, zone: 洪山}

hobbies: [足球, 篮球]

skhttp://ills: [编程, 金融]

pet:

nickName: wc

strain: hsq

在这里注意不同数据类型的写法,简单的数据直接赋值

# map类型和对象类型 的两种写法

# 1.行内写法

location: {province: 湖北,city: 武汉, zone: 洪山}

pet: {nickName: wc, strain: hsq}

# 2.分行写

location:

province: 湖北

city: 武汉

zone: 洪山

pet:

nickName: wc

strain: hsq

# 数组、list、set

# 1、行内写法, 其中中括号还可以省略

hobbies: [足球, 篮球]

skills: [编程, 金融]

# 2、分行写

hobbies:

- 足球

- 篮球

skills:

- 编程

- 金融

到 SpringBoot 测试文件中测试输出

@Autowired

Student student;

@Test

void contextLoads() {

System.out.println(student);

}

结果

Student{name='zs', age=23, sex=true, birthday=Thu Oct 01 00:00:00 CST 2020, location={province=湖北, city=武汉, zone=洪山}, hobbies=[足球,篮球], skills=[编程, 金融], pet=Pet{nickName='wc', strain='hsq'}}

上面yml中注意

# 如果对字符串加单引号,双引号会有什么区别

location: {province: "湖北",city: '武汉', zone: 洪山}

# 如果引号中只是字符串时没什么区别

location: {province: "湖\n北",city: '武\n汉', zone: 洪\n山}

# 此时双引号中的转义字符会被识别,会换行,单引号和不加引号会原样输出

也可以使用properties注入

student.name=ls

student.age=24

...

其中properties文件和yml文件中的值可以互相引用。两个配置文件可以互补,properties文件优先级高于yml

另外如果要注入的值不在这两个默认配置文件中,这是需要使用@PropertySource注解,遗憾的是该注解只支持properties文件,不支持yml文件

@PropertySource(value = {"classpath:conf.properties"})

public class Student {

...

配置文件值注入方式

1.1 从全局配置文件中读取配置到实体类 (@ConfigurationProperties)

配置文件 (application.yml)(写在application.properties也可以,格式变一下即可)

person:

lastName: Mary

age: 16

birthDate: 2004/01/01

maps: {one:1,two:2,three:3}

lists:

- 1

- 2

- 3

pet:

name: wangcai

age: 3

实体类(javaBean):

/**

* 将配置文件中配置的每一个属性的值,映射到这个组件中

*

* @Component:

* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;

*

* @ConfigurationProperties:

* 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定(默认配置文件为application.properties与

* application.yml);

*

* prefix = "person":

* 配置文件中哪个下面的所有属性进行一一映射

*/

@Component

@ConfigurationProperties(prefix = "person")

public class Person {

private String lastName;

private Integer age;

private Date birthDate;

private Map maps;

private List lists;

private Pet pet;

//省略get,set方法

@Override

public String toString() {

String mapValue = "";

if(this.maps!=null){

for(String key:this.maps.keySet()){

Object value = this.maps.get(key);

mapValue += key+"\t"+value+"\t";

}

}

return "lastName:"+this.lastName+

"\nage:"+this.age+

"\nbirthDate:"+this.birthDate+

"\nmaps:"+mapValue+

"\nlists:"+this.lists+

this.pet;

}

}

public class Pet {

private String name;

private Integer age;

//省略get,set方法

@Override

public String toString() {

return "\nPet:\n\tPet name:"+this.name+

"\n\tPet age:"+this.age+"\n";

}

}

我们可以导入配置文件处理器,以后编写配置就有提示了(pom.xml)

org.springframework.boot</groupId>

spring-boot-configuration-processor

true

测试

@SpringBootTest

class DemoApplicationTests {

@Autowired

Person person;

@Test

void contextLoads() {

System.out.println(person.toString());

}

}

1.2 全局配置文件注入值(@Value)

@Value 其实是Spring中的注解,其功能使用xml文件描述是这样的:

其中property表示的是Person类中的各项属性,name用于指定具体属性,value用于指定值。

value的值主要有3种:

字面量,也就是数字(1,2…)、字符串(abc)、布尔变量(true、false)等常量${key},从环境变量、配置文件中获取值#{SpEL}, Spring的表达式语言,可以执行一些计算,调用一些函数

@Component

public class Person {

@Value("${person.last-name}") //@Value("#{'Lily'.toUpperCase()}")

private String lastName;

@Value("#{11*2}")

private Integer age;

private Date birthDate;

private Map maps;

private List lists;

private Pet pet;

//省略get,set和toString

}

1.3 从指定文件读取并配置实体类(@PropertySource+@ConfigurationProperties)

在 resources 目录下创建 person.properties

person.lastName = Lily

person.age = 20

person.birthDate = 2000/01/01

person.maps.one = 1

person.maps.two = 2

person.lists = a,b,ch

person.pet.name = wangcai

person.pet.age = 3

更改 Person 类中的注解

@Component

@PropertySource(value = {"classpath:person.properties"})

@ConfigurationProperties(prefix = "person")

public class Person {

//...省略属性,get,set,toString

}

要注意的是,PropertySource 只支持properties文件,不支持yml文件读取。

1.4 从指定文件读取并注入值(@PropertySource+@Value)

创建配置文件

更改注释

@Component

@PropertySource(value = {"classpath:person.properties"})

public class Person {

@Value("${person.last-name}")

private String lastName;

//...省略属性,get,set,toString

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:编写高质量代码——改善Python程序的91个建议(Ⅴ)(编写高质量python代码的59个有效方法)
下一篇:编写高质量代码——改善Python程序的91个建议(Ⅶ)(python代码简洁)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~