Spring Boot学习(二)----读取属性文件
一、读取文件属性值
Spring Boot可以对.properties文件,以及.yml文件进行读取其属性值。
在进行读取文件前,我们先搭建一个SpringBoot环境
第一步,建一个springboot项目,

第二步,配置pom.xml文件,并update Maven,注意pom.xml文件中有个文件处理器spring-boot-configuration-processor
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zk.myspringboot_003</groupId>
<artifactId>myspringBoot_003</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<finalName>myspringboot_003</finalName>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 继承父包 -->
</dependencies>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
</project>
接下来就是我们进行读取properties文件。
读取.properties文件
读取.properties属性文件一共存在三种方法,我们首先在src/main/resources下创建一个属性文件application.properties(springboot默认读取application命名的属性内容),并输入如下属性内容:
demo.name=zk
demo.age=25
#map
demo.login[username]=zhangdeshuai
demo.login[password]=zhenshuai
demo.login[callback]=http://www.flyat.cc
#list
demo.urls[0]=http://ztool.cc
demo.urls[1]=http://ztool.cc/format/js
demo.urls[2]=http://ztool.cc/str2image
demo.urls[3]=http://ztool.cc/json2Entity
demo.urls[4]=http://ztool.cc/ua
第一种:使用@Value注解进行读取:
第一步,在TestController.java中使用@Value的注解配置demo的属性值。
package com.zk.myspringboot_003;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Value("${demo.name}")
private String name;
@Value("${demo.age}")
private String age;
@RequestMapping("/demo")
public String hello()
{
return "hello,"+name+",you are "+age+"demo1";
}
}
在测试类SpringBootApp中设置启动后,访问http://localhost:8080/demo,执行的结果如下:

第二种:使用Environment进行读取:
TestController.java
package com.zk.myspringboot_003;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private Environment environment;
@RequestMapping("/demo2")
public String getprops(){
String name=environment.getProperty("demo.name");
String age=environment.getProperty("demo.age");
return "hello,"+name+".you are "+age+"demo2";
}
}
访问http://localhost:8080/demo2,运行结果如下:

第三种:使用@PropertySource进行访问:
第一步:配置一个ConfigBean.java
ConfigBean.java
package com.zk.myspringboot_003;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "demo")
@PropertySource(value = "application.properties")
public class ConfigBean {
private String name;
private String age;
private Map<String, String> login=new HashMap<String,String>();
private List<String> urls=new ArrayList<String>();
public Map<String, String> getLogin() {
return login;
}
public void setLogin(Map<String, String> login) {
this.login = login;
}
public List<String> getUrls() {
return urls;
}
public void setUrls(List<String> urls) {
this.urls = urls;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
第二步,写TestController.java
package com.zk.myspringboot_003;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private ConfigBean configBeanProp;
@RequestMapping("/demo3")
public String getBean(){
String name=configBeanProp.getName();
String age=configBeanProp.getAge();
List<String> urlslist=configBeanProp.getUrls();
Map<String,String> loginmap=configBeanProp.getLogin();
return "hello,"+name+".you are "+age+"demo3"+urlslist.toString()+"\n"
+loginmap.get("username")+" "+loginmap.get("username")+"\n"+loginmap.get("password")+"\n"+loginmap.get("callback");
}
}
访问http://localhost:8080/demo3,结果如下:

运行成功。
注意:我们可以使用@PropertySource(value="application.properties")标签配置不同的properties属性文件,进行文件属性读取。
读取.yml文件
在SpringBoot中,可以使用yml文件代替properties文件,但是yml文件是阶梯呈现的,与properties的key-value格式有所不同。在yml文件中,我们需要注意以下几个点:
1.yml的每一级之间必须换行,且在下一级开始需要进行一个Tab键的缩进。
2.在yml文件中,对应的赋值方式采用key: value格式,在“:”之后必须存在一个空格键的缩进。
3.在yml文件里面所有的配置,相同级别只能出现一次,比如我们使用server这个级别,那么我们在后面进行server级别配置时只能在已使用的server下面进行配置,不能重新开始一个新的同级别server。
接下来就是我们的yml文件读取实例:
同样建立一个Springboot项目,项目结构如下:

pom.xml文件配置与.properties文件相同。
第一步:在resources下配置一个application.yml文件,文件内容如下:
application.yml
wq:
person:
lastName: zk
age: 25
boss: true
birth: 2020/3/5
maps: {key1: value1,key2: value2}
list: [dog,cat,house]
dog:
name: 旺财
age: 3
第二步,配置两个JavaBean,Dog.java和Person.java
Dog.java
package com.zk.myspringboot_004;
public class Dog {
private String name;
private int age;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person.java
package com.zk.myspringboot_004;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
//prefix前缀需要和yml配置文件里的匹配。
@ConfigurationProperties(prefix = "wq.person")
public class Person {
private String lastName;
private int age;
private boolean boss;
private Date birth;
private Map<String,String> maps;
private List<String> list;
private Dog dog;
//toString()
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", list=" + list +
", dog=" + dog +
'}';
}
//get set方法
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isBoss() {
return boss;
}
public void setBoss(boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, String> getMaps() {
return maps;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
第三步,配置一个TestController.java,提供一个demo的RequestMapping。
TestController.java
package com.zk.myspringboot_004;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
Person person;
@RequestMapping("/demo")
public String hello()
{
return person.getLastName()+" "
+person.getAge()+" "+person.getBirth()+" "+person.getDog()+" "+person.getList()
+""+person.getMaps();
}
}
最后配置我们的入口程序SpringBootApp.java
SpringBootApp.java
package com.zk.myspringboot_004;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootApp{
public static void main(String[]args){
SpringApplication.run(SpringBootApp.class, args);
}
}
启动项目后,访问http://localhost:8080/demo,运行结果如下:
![]()
访问成功。
二、@Value获取值和@ConfigurationProperties获取值比较
| @ConfigurationProperties | @Value | |
| 功能 | 批量注入配置文件中的属性 | 一个个指定 |
| 松散绑定(松散语法) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复杂数据类型 | 支持 | 不支持 |
配置文件yml还是Properties他们都能获取到值
如果只是在某个业务逻辑中获取一下某个配置文件的某项值,使用@Value
如果专门编写了一个javaBean来和配置文件进行映射,就直接使用@ConfigurationProperties
参考网址:https://blog.csdn.net/weixin_33446857/article/details/84932631

浙公网安备 33010602011771号