小编给大家分享一下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项目
项目结构:
创建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(生产)环境设置一些值
不同环境下的测试的配置参数的值不一致,为了测试参数名设置相同下,是否取得对应运行环境的值
创建实体类
创建加载配置文件的配置类
@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); }}
启动时添加对应的运行环境设置
-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; }
再次启动环境(sit下)
在浏览器中输入:http://localhost:8000/test/getvalue
再指定prod环境下的运行
使用浏览器请求路由
看完了这篇文章,相信你对“springboot怎么读取配置文件到静态工具类”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!