软件编程
位置:首页>> 软件编程>> java编程>> springboot如何读取配置文件到静态工具类

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

作者:caihaibo  发布时间:2023-11-28 04:44:54 

标签: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注解

来源:https://blog.csdn.net/u014379639/article/details/89631488

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com