文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springboot怎么读取配置文件到静态工具类

2023-06-22 02:41

关注

小编给大家分享一下springboot怎么读取配置文件到静态工具类,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

springboot读取配置文件到静态工具类

通常我们读取配置文件可以用@Value注解和@Configuration,@ConfigurationProperties(prefix = "xxx")等注解,但是这种方式是无法把配置读取到静态变量的,如果我们想在项目初始化时把配置文件加载到一个工具类,然后通过静态变量的方式调用的话我们就不能使用这两种方法。

我们可以用Environment 来解决

不废话了,直接上代码

import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.env.Environment;import org.springframework.stereotype.Component; @Componentpublic class ConfigConstant {  @Autowired  private Environment env;    public static String url;  public static String param;     @PostConstruct  public void readConfig() {    url = env.getProperty("config.url");    param = env.getProperty("config.param");  }}

我写完以后发现有些麻烦,下面是改进的方法,不需要每个配置都去get一下,只需要把配置文件的key与工具类的静态变量名写成一样的即可。

import java.io.UnsupportedEncodingException;import java.lang.reflect.Field; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.env.Environment;import org.springframework.stereotype.Component; @Componentpublic class ConfigConstant {  @Autowired  private Environment env;    public static String url;  public static String name;      @PostConstruct  public void readConfig() throws Exception {    String prefix = "config.";    Field[] fields = ConfigConstant.class.getFields();    for(Field field : fields ){      field.set(null, getProperty(prefix + field.getName()));    }  }    private String getProperty(String key) throws UnsupportedEncodingException {    return new String(env.getProperty(key).getBytes("ISO-8859-1"), "UTF-8");  }}

大哥说这样写依赖spring, 单测调代码的时候不方便,所以又写了一个不依赖spring的版本。

import java.io.InputStreamReader;import java.lang.reflect.Field;import java.util.Properties; public class ConfigConstant {   public static String CONFIG_URL;  public static String CONFIG_NAME;   static {    try {      Properties props = new Properties();      props.load(new InputStreamReader(          ConfigConstant.class.getClassLoader().getResourceAsStream("application.properties"),          "UTF-8"));      String profile = props.getProperty("spring.profiles.active");      String envFile = "application-" + profile + ".properties";      Properties envProps = new Properties();      envProps.load(new InputStreamReader(          ConfigConstant.class.getClassLoader().getResourceAsStream(envFile), "UTF-8"));      Field[] fields = ConfigConstant.class.getFields();      for (Field field : fields) {        field.set(null, envProps.getProperty(field.getName().replace("_", ".").toLowerCase()));      }    } catch (Exception e) {      e.printStackTrace();    }  }}

将配置文件的值加载到工具类的静态变量中(多环境运行加载)

首先创建一个SpringBoot项目

项目结构:

springboot怎么读取配置文件到静态工具类

创建pom文件,映入maven工程依赖

<?xml version="1.0" encoding="UTF-8"?><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.csrcb</groupId>    <artifactId>spring_static</artifactId>    <version>1.0-SNAPSHOT</version>     <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.1.6.RELEASE</version>    </parent>     <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>        </dependency>    </dependencies> </project>

创建配置文件

在resource目录下,创建配置文件application.yml,创建几个不同环境的application-dev,application-sit、application-prod.yml的配置文件,稍后做测试使用,看是否加载不同环境下的配置参数的值

application.yml很简单就一个端口号的配置:

springboot怎么读取配置文件到静态工具类

在application-dev.yml(开发环境的配置参数的值)、以及sit(测试)、uat(验证)、prod(生产)环境设置一些值

springboot怎么读取配置文件到静态工具类

不同环境下的测试的配置参数的值不一致,为了测试参数名设置相同下,是否取得对应运行环境的值

创建实体类

创建加载配置文件的配置类

@Configuration@Datapublic class TestConfig {    @Value("${ftp.username}")    private String username;     @Value("${ftp.passwd}")    private String passwd;     @PostConstruct    public void init(){        ClientUtil.setConfigInfo(this);    }}

创建工具类,工具类获得配置类的参数值

@Slf4jpublic class ClientUtil {     private static String USERNAME;    private static String PASSWD;     public static void setConfigInfo(TestConfig testConfig) {        ClientUtil.USERNAME = testConfig.getUsername();        ClientUtil.PASSWD = testConfig.getPasswd();    }     public static String getValue(){        log.info("获得配置文件的username的值:{}",USERNAME);        return USERNAME;    }}

创建路由,模拟调用

@RestController@RequestMapping(value = "/test")public class TestController {     @GetMapping("/getvalue")    public String getValue(){        return ClientUtil.getValue();    }}

创建启动类,在启动类中添加Bean,为了防止启动时配置类的@Value注解找不到配置文件中的值,一个配置文件找不到继续找

@SpringBootApplicationpublic class AppStart {    public static void main(String[] args) {        SpringApplication.run(AppStart.class,args);    }}

启动时添加对应的运行环境设置

springboot怎么读取配置文件到静态工具类

-Dspring.profiles.active=sit

若springboot版本低可能会出现

java.lang.IllegalArgumentException: Could not resolve placeholder ‘username' in value “${ftp.username}”这样的报错

解决办法:在启动类中添加下面的代码

    @Bean    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){        PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();        c.setIgnoreUnresolvablePlaceholders(true);        return c;    }

springboot怎么读取配置文件到静态工具类

再次启动环境(sit下)

在浏览器中输入:http://localhost:8000/test/getvalue

springboot怎么读取配置文件到静态工具类

再指定prod环境下的运行

springboot怎么读取配置文件到静态工具类

使用浏览器请求路由

springboot怎么读取配置文件到静态工具类

看完了这篇文章,相信你对“springboot怎么读取配置文件到静态工具类”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯