SpringBoot 配置文件给实体注入值方式
配置文件给实体注入值
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<string, object> location; private string[] hobbies; private list<string> skills; private pet pet; // .... set/get/tostring }
# yml 配置文件 student: name: zs age: 23 sex: true birthday: 2020/10/1 location: {province: 湖北,city: 武汉, zone: 洪山} hobbies: [足球, 篮球] skills: [编程, 金融] 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<string,object> maps; private list<object> 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)
<!--导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-configuration-processor</artifactid> <optional>true</optional> </dependency>
测试
@springboottest class demoapplicationtests { @autowired person person; @test void contextloads() { system.out.println(person.tostring()); } }
1.2 全局配置文件注入值(@value)
@value 其实是spring中的注解,其功能使用xml文件描述是这样的:
<bean class="person"> <property name="lastname" value="字面量/${key}从环境变量、配置文件中获取值/#{spel}"></property> <bean/>
其中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<string,object> maps; private list<object> 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 }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 干得好
下一篇: 网易博客宣布网站关停