一、前言
在最近项目开发中,有一个需求,针对自定义注解中字符串属性值的设置需要支持使用”${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框架环境变量
*/
@Autowired
private Environment environment;
public static SpringEnvUtils springEnvUtils;
/***
* 通过@PostConstruct的特性,将当期对象赋予静态变量
*/
@PostConstruct
public 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框架自定义解析配置项占位符(${})获取配置的功能了,以上实现只作为参考,实际开发中可进行进一步优化。