SpringBoot笔记:@Value、@ConfigurationProperties、@PropertySource 配置参数的几种方式

导读:本篇文章讲解 SpringBoot笔记:@Value、@ConfigurationProperties、@PropertySource 配置参数的几种方式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

yml格式文件

这里如果使用的 yml 格式文件测试,其实 yml 和 properties 文件使用上没有本质区别,仅仅是格式不同,本文使用的是 yml 文件进行的测试。l格式文件配置信息如下,其中test是这次要解析的字段:

#端口,项目上下文
server:
  port: 8080
  servlet:
    context-path: /helloworld-demo

test:
  name: 云天明
  age: 18
  address: 河南省郑州市

方式一:@ConfigurationProperties注解方式

使用ConfigurationProperties来获取配置文件的字段,参数prefix代表配置的前缀,@Data使用是的是lombok插件

package com.demo.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 获取自定义配置方法一
 */
@Data
@Component
// 如果是外部配置文件(非application.yml 文件)可以用下面这个注解把配置文件引入进来
// @PropertySource(value = {"classpath:config/test.properties"})
@ConfigurationProperties(prefix = "test")
public class MyConfig1 {
    private String name;
    private Integer age;
    private String address;
}

方式二:@Value注解方式

package com.demo.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 获取自定义配置方法二
 */
@Data
@Component
public class MyConfig2 {
    @Value("${test.name}")
    private String name;
    @Value("${test.age}")
    private Integer age;
    @Value("${test.address}")
    private String address;
}

方式三:Environment获取方式

package com.demo.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/**
 * 获取自定义配置方法二
 */
@Component
@Configuration
public class MyConfig3 {
    @Autowired
    Environment env;
    
    public String getName() {
        return env.getProperty("test.name");
    }
    public Integer getAge() {
        return env.getProperty("test.age", Integer.class);
    }
    public String getAddress() {
        return env.getProperty("test.address");
    }
}

测试结果

    @Autowired
    MyConfig1 myConfig1;
    @Autowired
    MyConfig2 myConfig2;
    @Autowired
    MyConfig3 myConfig3;

    @RequestMapping("/getMyconfig")
    public void getMyconfig() throws IOException {
        log.info("Myconfig1 姓名:{},年龄:{},住址:{}", myConfig1.getName(), myConfig1.getAge(), myConfig1.getAddress());
        log.info("Myconfig2 姓名:{},年龄:{},住址:{}", myConfig2.getName(), myConfig2.getAge(), myConfig2.getAddress());
        log.info("Myconfig3 姓名:{},年龄:{},住址:{}", myConfig3.getName(), myConfig3.getAge(), myConfig3.getAddress());
    }

测试结果:

2021-01-07 20:56:13.666  INFO 50108 --- [nio-8080-exec-1] com.demo.controller.TestController       : Myconfig1 姓名:云天明,年龄:18,住址:河南省郑州市
2021-01-07 20:56:13.668  INFO 50108 --- [nio-8080-exec-1] com.demo.controller.TestController       : Myconfig2 姓名:云天明,年龄:18,住址:河南省郑州市
2021-01-07 20:56:13.670  INFO 50108 --- [nio-8080-exec-1] com.demo.controller.TestController       : Myconfig3 姓名:云天明,年龄:18,住址:河南省郑州市

propetries格式文件

如果是properties文件,以上的方法也是可以使用的,下面这篇文章中提供了多种获取resources目录下文件的方式
《如何读取resources目录下的文件路径(九种方式)》
获取propetries内容前提就是首先获取propetries,配置文件记得使用UTF-8编码,以免出现乱码问题

方法四:通过文件流配合Properties类读取

主要思想是获取文件inputStream流,然后使用Properties类load方式读取,测试代码如下:

    @RequestMapping("/getMyconfig4")
    public void getMyconfig4() {
        //通过这种方式获取文件流
        try(InputStream inputStream = ClassLoader.getSystemResourceAsStream("test.properties")){
            Properties prop = new Properties();
            //指定编码为UTF-8以防中文乱码
            prop.load(new InputStreamReader(inputStream, "UTF-8"));
            String name = prop.getProperty("test.name");
            String age = prop.getProperty("test.age");
            String address = prop.getProperty("test.address");
            log.info("Myconfig4 姓名:{},年龄:{},住址:{}", name, age, address);
        }catch (Exception e){
            log.error("获取配置文件失败",e);
        }
    }

测试结果:

2021-01-07 21:46:16.447  INFO 4568 --- [nio-8080-exec-4] com.demo.controller.TestController       : Myconfig4 姓名:云天明,年龄:18,住址:河南省郑州市

方法五:通过ResourceBundle类读取

通过 ResourceBundle.getBundle(“test”)直接过去配置文件,并且读取配置文件内容。

    @RequestMapping("/getMyconfig5")
    public void getMyconfig5() {
        try {
            //注意这里的test只有文件名不带类型
            ResourceBundle resource = ResourceBundle.getBundle("test");
            String name = changeToUTF8(resource.getString("test.name"));
            String age = changeToUTF8(resource.getString("test.age"));
            String address = changeToUTF8(resource.getString("test.address"));
            log.info("Myconfig5 姓名:{},年龄:{},住址:{}", name, age, address);
        } catch (Exception e) {
            log.error("获取配置文件失败", e);
        }
    }

    /**
     * 将原来编码为8859-1字符串转为UTF-8编码
     *
     * @param str
     * @return
     */
    private String changeToUTF8(String str) throws UnsupportedEncodingException {
        if (str == null) {
            return null;
        }
        return new String(str.getBytes("ISO8859-1"));
    }

测试结果:

2021-01-07 22:12:56.178  INFO 36044 --- [nio-8080-exec-2] com.demo.controller.TestController       : Myconfig5 姓名:云天明,年龄:18,住址:河南省郑州市

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72629.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!