一、前言
在最近项目开发中,有一个需求,针对自定义注解中字符串属性值的设置需要支持使用”${xx}
“占位符获取在SpringBoot框架配置文件中配置项对应的属性值,而且支持多个”${xx}
“标识的配置任意拼接。
二、功能实现
从实现思路上说还是很简单的,可以通过正则表达式,匹配出包含“${xx}
”的字符串,然后将占位符"${}
“去掉,用配置项从spring容器环境变量中获取对应属性值替换即可。
1. 参考实现代码
定义获取Spring Boot配置项内容工具类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import javax.annotation.PostConstruct;
import java.util.regex.Matcher;
import java.util.regex.Pattern;@Component
public class SpringEnvUtils {/*** * 注入spring框架环境变量*/@Autowiredprivate Environment environment;public static SpringEnvUtils springEnvUtils;/*** * 通过@PostConstruct的特性,将当期对象赋予静态变量*/@PostConstructpublic void init() {springEnvUtils = this;}private static Pattern VAR_COMPILE;static {// 定义需要解析的正则表达式String pattern = "\\$\\{.+?\\}";VAR_COMPILE = Pattern.compile(pattern);}/*** * 环境变量占位符前缀*/private static final String VAR_FLAG_PREFIX = "${";/*** * 环境变量占位符后缀*/private static final String VAR_FLAG_SUFFIX = "}";/*** * 通过解析占位符key获取对应的Spring容器环境变量属性值,如${server.port}* @param key* @return* */public static String getPropertyWithVarFlag(String key) {if (StringUtils.hasLength(key)) {// if (key.contains(VAR_FLAG_PREFIX)) { // 判断是否包含占位符信息Matcher matcher = VAR_COMPILE.matcher(key);while (matcher.find()) {//如果匹配到了,则进行替换String varKey = matcher.group();String value = getProperty(varKey.replace(VAR_FLAG_PREFIX, "").replace(VAR_FLAG_SUFFIX, ""));key = key.replace(varKey, value);}// }return key;}return key;}/*** * 通过key获取对应的Spring容器环境变量属性值* @param key* @return*/public static String getProperty(String key) {return springEnvUtils.environment.getProperty(key);}
}
2. 功能测试
- 测试代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/**
* 程序启动入口
*/
@SpringBootApplication
public class Main {public static void main(String[] args) throws Exception {SpringApplication.run(Main.class, args);// 表达式中存在${}标识的占位符String withVarFlag = SpringEnvUtils.getPropertyWithVarFlag("application port is : ${server.port}");System.out.println("表达式中存在${}标识的占位符:" + withVarFlag);// 普通字符串String noVarFlag = SpringEnvUtils.getPropertyWithVarFlag("hello, spring boot.");System.out.println("\n普通字符串:" + noVarFlag);}
}
测试结果:
由此就可以实现SpringBoot框架自定义解析配置项占位符(${})获取配置的功能了,以上实现只作为参考,实际开发中可进行进一步优化。