欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-23 09:12:11
目录springboot读取配置文件到静态工具类我们可以用environment 来解决将配置文件的值加载到工具类的静态变量中(多环境运行加载)首先创建一个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项目

项目结构:

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如何读取配置文件到静态工具类

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

创建实体类

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);
    }
}

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

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

-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;
    }

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

再次启动环境(sit下)

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

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

再指定prod环境下的运行

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

使用浏览器请求路由

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

关键使用了@value注解以及@postconstruct注解

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