springboot如何获取yaml/yml(或properties)配置文件信息

 更新时间:2024年11月04日 11:02:23   作者:YD_1989  
在SpringBoot项目中,读取配置文件信息是常见需求,可以通过@Autowired注入Environment类,使用@Value注解直接注入配置信息,或定义工具类结合ApplicationRunner进行高级配置信息获取,特别提到

springboot项目获取配置文件信息

前言

在分布式项目开发中,通常会使用配置中心(例如:Apollo 配置中心)将配置文件和项目解耦。

为了更具灵活性,有时候需要把一些数据放在配置文件中获取,能够减少很多麻烦,这个时候就需要读取配置文件信息。

本文结合实际开发介绍几种使用过的读取配置文件的方法。

首先在配置文件中配置一条数据:

spring.application.name = user-service

1、@Autowired 注入 Environment类

和项目中注入 service 或者 mapper 一样,声明一个 Environment 类变量,加上 @Autowire 注解。

如下:

    @Autowired
    private Environment environment;

该类所属包:

import org.springframework.core.env.Environment;

代码获取配置:

String applicationName = environment.getProperty("spring.application.name");

注意:key一定要写完整,有几层就写几层,每层的名字用点分隔。

但是,使用该方法具有一定的局限性。

局限性1:使用在静态方法中

如果要在静态方法中读取配置信息,不能简单的将 Environment 定义成 static 就完了,由于注入机制,注入一个静态的 bean 只会得到一个空的 bean,即变量的值为 null,一旦使用该 bean 对象就会报空指针异常。

错误使用方法:

    @Autowired
    private static Environment environment;//只定义成静态变量,environment 只会是null
	public static void m1(){
		// 一旦使用environment变量就会报空指针异常
		String applicationName = environment.getProperty("spring.application.name");	
	}

正确使用方法:

  1. 将 Environment 定义成 static 静态变量
  2. 加上 environment 的 getter/setter 方法
  3. 将@Autowire注解加到set方法上

需要注意的是,只需要 get 方法是静态的即可,set 方法不要静态,否则得到的 environment 还是null。

正确代码如下:

	private static Environment environment;

    @Autowired
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    public static Environment getEnvironment() {
        return environment;
    }

局限性2:无法直接读取自定义的Yml配置文件

Environment 无法直接读取自定义的配置文件,需要通过增加一个配置类,将自定义的配置文件暴露到spring environment 中。

解决方法:

定义一个配置类,将自定义的配置文件内容加载到 Environment 中,代码如下:

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;

/**
 * 配置类
 * @Description 读取自定义Yml格式配置文件
 */
@Component
public class JdbcConfig {
    @Bean
    public PropertySourcesPlaceholderConfigurer getSqlConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean sqlConfigBean = new YamlPropertiesFactoryBean();
        sqlConfigBean.setResources(new ClassPathResource("jdbc-properties.yml"));
        configurer.setProperties(sqlConfigBean.getObject());
        return configurer;
    }
}

写好配置类,就可以通过注解 @Autowired 注入 Environment 类来读取自定义配置信息了。

2、基础用法,使用@Value注解直接注入配置信息

使用方式:

@Value(“${xxx.xxx.xxx}”)

代码如下:

    @Value("${spring.application.name}")
    private String applicationName;

注意:该方法也具有上述局限性。

3、进阶方法(推荐使用)

定义一个工具类,使用 @Component 注解使其成为配置类,继承ApplicationRunner 重写run()方法,再注入 Environment 获取配置,这样当项目启动好之后,配置的信息就已经加载完毕,可以做到在任何地方随时随地获取配置信息。

代码如下:

配置类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class BaseConfig implements ApplicationRunner {

    @Autowired
    private Environment  environment;

    public static String applicationName;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        applicationName = environment.getProperty("spring.application.name");

    }
}

使用:直接用调用工具类的静态属性即可获取配置信息。

    @PostMapping(value = "/test/config")
    public List<String> testConfig() {
        List<String> list = new ArrayList<String>();
        list.add(BaseConfig.applicationName);
        return list;
    }

postman 测试结果:

拓展:springboot 集成配置中心 - 以 Apollo 为例

微服务中会使用配置中心管理配置文件信息,springBoot 通常会和这些配置中心集成提供一些方法获取配置信息,本文以 Apollo 配置中心为例展示如何获取配置信息。

  • (1)添加依赖
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>red-apollo-client</artifactId>
</dependency>
  • (2)代码使用
Config config = ConfigService.getAppConfig();// 连接到 ConfigService 的 DEV/SIT/UAT/PROD 等环境
String applicationName = config.getProperty("spring.application.name", ""); // 获取配置信息

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 从原理到实战深入理解Java 断言assert

    从原理到实战深入理解Java 断言assert

    本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代,附常见问题解答及实践案例,感兴趣的朋友一起看看吧
    2025-06-06
  • Java 8中的Collectors API介绍

    Java 8中的Collectors API介绍

    这篇文章主要介绍了Java 8中的Collectors API,Stream.collect()是Java 8的流API的终端方法之一。它允许我们对流实例中保存的数据元素执行可变折叠操作,下文相关内容需要的小伙伴可以参考一下
    2022-04-04
  • SpringBoot实现对超大文件进行异步压缩下载的使用示例

    SpringBoot实现对超大文件进行异步压缩下载的使用示例

    在Web应用中,文件下载功能是一个常见的需求,本文介绍了SpringBoot实现对超大文件进行异步压缩下载的使用示例,具有一定的参考价值,感兴趣的可以了解一下,
    2023-09-09
  • springboot集成微软teams的实例代码

    springboot集成微软teams的实例代码

    Microsoft Teams 是一款基于聊天的智能团队协作工具,可以同步进行文档共享,并为成员提供包括语音、视频会议在内的即时通讯工具,今天给大家介绍springboot集成微软teams的示例代码,感兴趣的朋友一起看看吧
    2022-01-01
  • MyBatis代理Dao方式的增删改查的实现小结

    MyBatis代理Dao方式的增删改查的实现小结

    本文主要介绍了MyBatis代理Dao方式的增删改查的实现小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 如何使用Gradle实现类似Maven的profiles功能

    如何使用Gradle实现类似Maven的profiles功能

    这篇文章主要介绍了如何使用Gradle实现类似Maven的profiles功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • CORS跨域问题常用解决方法代码实例

    CORS跨域问题常用解决方法代码实例

    这篇文章主要介绍了CORS跨域问题常用解决方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • java不同线程解读以及线程池的使用方式

    java不同线程解读以及线程池的使用方式

    这篇文章主要介绍了java不同线程解读以及线程池的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 关于Openfire集群源码的分析

    关于Openfire集群源码的分析

    这篇文章主要介绍了关于Openfire集群源码的分析,内容比较详细,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • Java实现画图 给图片底部添加文字标题

    Java实现画图 给图片底部添加文字标题

    这篇文章主要介绍了Java实现画图 给图片底部添加文字标题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论