Spring Boot学习(二)----读取属性文件

一、读取文件属性值

Spring Boot可以对.properties文件,以及.yml文件进行读取其属性值。

在进行读取文件前,我们先搭建一个SpringBoot环境

第一步,建一个springboot项目,

第二步,配置pom.xml文件,并update Maven,注意pom.xml文件中有个文件处理器spring-boot-configuration-processor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<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命名的属性内容),并输入如下属性内容:

1
2
3
4
5
6
7
8
9
10
11
12
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注解进行读取:

官网地址:https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#boot-features-external-config

第一步,在TestController.java中使用@Value的注解配置demo的属性值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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进行访问:

官网地址:https://docs.spring.io/spring/docs/5.0.6.RELEASE/javadoc-api/org/springframework/context/annotation/PropertySource.html

第一步:配置一个ConfigBean.java

ConfigBean.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

1
2
3
4
5
6
7
8
9
10
11
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

1
2
3
4
5
6
7
8
9
10
11
12
13
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

 

posted @   leagueandlegends  阅读(432)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示