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

 更新时间:2021年12月16日 15:45:24   作者:caihaibo  
这篇文章主要介绍了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; 
/**
 * 
 * @Description: 配置常量类——根据不同的spring-profile加载不同的配置
 * @author: eric.zhang
 * @date: 2018年7月20日 上午10:59:24
 */
@Component
public 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; 
/**
 * 
 * @Description: 配置常量类——根据不同的spring-profile加载不同的配置,变量名要与配置文件里写的名一致
 * @author: eric.zhang
 * @date: 2018年7月20日 上午10:59:24
 */
@Component
public 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; 
/**
 * 
 * @Description: 配置常量类——根据不同的spring-profile加载不同的配置
 *               变量名把配置文件的key中的"."替换成"_"命名
 * @author: eric.zhang
 * @date: 2018年7月20日 上午10:59:24
 */
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项目

项目结构:

创建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很简单就一个端口号的配置:

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

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

创建实体类

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

/**
 * @Classname TestConfig
 * @Description 加载配置文件的配置类
 * @Date 2020/6/16 16:28
 * @Created by gangye
 */
@Configuration
@Data
public class TestConfig {
    @Value("${ftp.username}")
    private String username;
 
    @Value("${ftp.passwd}")
    private String passwd;
 
    @PostConstruct
    public void init(){
        ClientUtil.setConfigInfo(this);
    }
}

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

/**
 * @Classname ClientUtil
 * @Description 工具类,将配置文件的数据通过config引入到静态变量中
 * @Date 2020/6/16 16:29
 * @Created by gangye
 */
@Slf4j
public 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;
    }
}

3.创建路由,模拟调用

/**
 * @Classname controller
 * @Date 2020/6/16 16:35
 * @Created by gangye
 */
@RestController
@RequestMapping(value = "/test")
public class TestController {
 
    @GetMapping("/getvalue")
    public String getValue(){
        return ClientUtil.getValue();
    }
}

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

/**
 * @Classname AppStart
 * @Description 启动类
 * @Date 2020/6/16 16:26
 * @Created by gangye
 */
@SpringBootApplication
public class AppStart {
    public static void main(String[] args) {
        SpringApplication.run(AppStart.class,args);
    }
}

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

-Dspring.profiles.active=sit

若springboot版本低可能会出现

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

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

    /**
     * Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘name' in value “${name}”
     * @Description 为了防止启动时配置类的@Value注解找不到配置文件中的值,一个配置文件找不到继续找
     * @Date 2020年6月17日14:40:08
     * @return
     */
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
        PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
        c.setIgnoreUnresolvablePlaceholders(true);
        return c;
    }

再次启动环境(sit下)

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

再指定prod环境下的运行

使用浏览器请求路由

关键使用了@Value注解以及@PostConstruct注解

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

相关文章

  • spring boot使用logback日志级别打印控制操作

    spring boot使用logback日志级别打印控制操作

    这篇文章主要介绍了spring boot使用logback日志级别打印控制操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 使用SpringBoot中的Schedule定时发送邮件的方法

    使用SpringBoot中的Schedule定时发送邮件的方法

    在SpringBoot中,你可以使用@Scheduled注解来创建定时任务,@Scheduled注解可以应用于方法上,表示这个方法是一个定时任务,可以根据指定的时间间隔或固定时间执行,本文就给大家介绍一下如何使用SpringBoot中的Schedule定时发送邮件,需要的朋友可以参考下
    2023-08-08
  • JDK8通过Stream 对List,Map操作和互转的实现

    JDK8通过Stream 对List,Map操作和互转的实现

    这篇文章主要介绍了JDK8通过Stream 对List,Map操作和互转的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 理解zookeeper选举机制

    理解zookeeper选举机制

    本文主要介绍了zookeeper选举机制的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java实现简单文件过滤器功能

    Java实现简单文件过滤器功能

    下面小编就为大家分享一篇Java实现简单文件过滤器功能,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 本地编译打包项目部署到服务器并且启动方式

    本地编译打包项目部署到服务器并且启动方式

    这篇文章主要介绍了本地编译打包项目部署到服务器并且启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java基本概念监视器实习原理解析

    Java基本概念监视器实习原理解析

    这篇文章主要介绍了Java基本概念监视器实习原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java如果在try里面执行return还会不会执行finally

    Java如果在try里面执行return还会不会执行finally

    这篇文章主要介绍了Java如果在try里面执行return,那么还会不会执行finally,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 一文搞懂Java并发AQS的共享锁模式

    一文搞懂Java并发AQS的共享锁模式

    这篇文章主要为大家阐述AQS另外一个重要模式,共享锁模式。共享锁可以由多个线程同时获取, 比较典型的就是读锁,感兴趣的小伙伴可以了解一下
    2022-10-10
  • Spring AOP如何实现注解式的Mybatis多数据源切换详解

    Spring AOP如何实现注解式的Mybatis多数据源切换详解

    这篇文章主要给大家介绍了关于Spring AOP如何实现注解式的Mybatis多数据源切换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论