0


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

文章目录

springboot 项目获取配置文件信息

前言

在分布式项目开发中,通常会使用配置中心(例如:Apollo 配置中心)将配置文件和项目解耦。为了更具灵活性,有时候需要把一些数据放在配置文件中获取,能够减少很多麻烦,这个时候就需要读取配置文件信息。本文结合实际开发介绍几种使用过的读取配置文件的方法。

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

spring.application.name = user-service

1、 @Autowired 注入 Environment类

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

@AutowiredprivateEnvironment environment;

该类所属包:

importorg.springframework.core.env.Environment;

代码获取配置:

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

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

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

局限性1:使用在静态方法中
如果要在静态方法中读取配置信息,不能简单的将 Environment 定义成 static 就完了,由于注入机制,

注入一个静态的 bean 只会得到一个空的 bean,即变量的值为 null

,一旦使用该 bean 对象就会报空指针异常。

错误使用方法:

@AutowiredprivatestaticEnvironment environment;//只定义成静态变量,environment 只会是nullpublicstaticvoidm1(){// 一旦使用environment变量就会报空指针异常String applicationName = environment.getProperty("spring.application.name");}

正确使用方法:

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

需要注意的是,

只需要 get 方法是静态的即可,set 方法不要静态

,否则得到的 environment 还是null。

正确代码如下:

privatestaticEnvironment environment;@AutowiredpublicvoidsetEnvironment(Environment environment){this.environment = environment;}publicstaticEnvironmentgetEnvironment(){return environment;}

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

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

importorg.springframework.beans.factory.config.YamlPropertiesFactoryBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.support.PropertySourcesPlaceholderConfigurer;importorg.springframework.core.io.ClassPathResource;importorg.springframework.stereotype.Component;/**
 * 配置类
 * @Description 读取自定义Yml格式配置文件
 */@ComponentpublicclassJdbcConfig{@BeanpublicPropertySourcesPlaceholderConfigurergetSqlConfigurer(){PropertySourcesPlaceholderConfigurer configurer =newPropertySourcesPlaceholderConfigurer();YamlPropertiesFactoryBean sqlConfigBean =newYamlPropertiesFactoryBean();
        sqlConfigBean.setResources(newClassPathResource("jdbc-properties.yml"));
        configurer.setProperties(sqlConfigBean.getObject());return configurer;}}

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

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

使用方式:

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

代码如下:

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

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

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

定义一个工具类,使用 @Component 注解使其成为配置类,

继承ApplicationRunner 重写run()方法

,再注入 Environment 获取配置,这样当项目启动好之后,配置的信息就已经加载完毕,可以做到在任何地方随时随地获取配置信息。

代码如下:

配置类:

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.ApplicationArguments;importorg.springframework.boot.ApplicationRunner;importorg.springframework.core.env.Environment;importorg.springframework.stereotype.Component;@ComponentpublicclassBaseConfigimplementsApplicationRunner{@AutowiredprivateEnvironment  environment;publicstaticString applicationName;@Overridepublicvoidrun(ApplicationArguments args)throwsException{
        applicationName = environment.getProperty("spring.application.name");}}

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

@PostMapping(value ="/test/config")publicList<String>testConfig(){List<String> list =newArrayList<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","");// 获取配置信息
标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/m0_58680865/article/details/142169004
版权归原作者 YD_1989 所有, 如有侵权,请联系我们删除。

“springboot 项目获取 yaml/yml (或 properties)配置文件信息”的评论:

还没有评论