springboot如何读取配置文件到静态工具类
这篇文章主要介绍了springboot实现读取配置文件到静态工具类方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
目录
springboot读取配置文件到静态工具类
我们可以用Environment 来解决
将配置文件的值加载到工具类的静态变量中(多环境运行加载)
首先创建一个SpringBoot项目
创建配置文件
创建实体类
springboot读取配置文件到静态工具类
通常我们读取配置文件可以用@Value注解和@Configuration,@ConfigurationProperties(prefix = "xxx")等注解,但是这种方式是无法把配置读取到静态变量的,如果我们想在项目初始化时把配置文件加载到一个工具类,然后通过静态变量的方式调用的话我们就不能使用这两种方法。
我们可以用Environment 来解决
不废话了,直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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与工具类的静态变量名写成一样的即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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的版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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工程依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <? 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.创建加载配置文件的配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /** * @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.创建工具类,工具类获得配置类的参数值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /** * @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.创建路由,模拟调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * @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注解找不到配置文件中的值,一个配置文件找不到继续找
1 2 3 4 5 6 7 8 9 10 11 12 | /** * @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); } } |
启动时添加对应的运行环境设置
1 | -Dspring.profiles.active=sit |
若springboot版本低可能会出现
java.lang.IllegalArgumentException: Could not resolve placeholder ‘username' in value “${ftp.username}”这样的报错
解决办法:在启动类中添加下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 | /** * 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注解
以上为个人经验,希望能给大家一个参考
原文链接:https://blog.csdn.net/u014379639/article/details/89631488