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

网友投稿 829 2022-09-08


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

目录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项目

项目结构:

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

xmlns:xsi="http://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">

4.0.0

com.csrcb

spring_static

1.0-SNAPSHOT

org.springframework.boot

spring-boot-starter-parent

2.1.6.RELEASE

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

xmlns:xsi="http://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">

4.0.0

com.csrcb

spring_static

1.0-SNAPSHOT

org.springframework.boot

spring-boot-starter-parent

2.1.6.RELEASE

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

创建配置文件

在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(){

ClientUtxezVjTkSfDil.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注解


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:互联网的三高架构
下一篇:携手推进国产化发展,未来智安与麒麟软件完成兼容互认证
相关文章

 发表评论

暂时没有评论,来抢沙发吧~