一般我们使用@Value去获取配置,比如apollo,nocas等热更新中间件,但某些业务场景,我们的 param是配置化的,但Value的获取却有相关的业务逻辑,不是简单的某个值,这个时候就可以使用到PropertyPlaceholderHelper。
package org.example;
import org.junit.Test;
import org.springframework.util.PropertyPlaceholderHelper;
import java.util.Objects;
import java.util.Properties;
public class PropertyPlaceholderHelperTest {
PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}");
/**
* 单个变量
*/
@Test
public void test() {
String text = "name=${name}";
Properties props = new Properties();
props.setProperty("name", "admin");
String result = helper.replacePlaceholders(text, props);
boolean equals = Objects.equals(result, "name=admin");
System.out.println(equals);
}
/**
* 多个变量
*/
@Test
public void testMore() {
String text = "name=${name},age=${age}";
Properties props = new Properties();
props.setProperty("age", "18");
props.setProperty("name", "admin");
String result = helper.replacePlaceholders(text, props);
boolean equals = Objects.equals(result, "name=admin,age=18");
System.out.println(equals);
}
/**
* 递归
*/
@Test
public void testRecursion() {
String text = "message=${message}";
Properties props = new Properties();
props.setProperty("message", "hi,${name}");
props.setProperty("name", "admin");
String result = helper.replacePlaceholders(text, props);
Objects.equals(result, "message=hi,admin");
}
/**
* 其他符号
*/
@Test
public void testOtherMark() {
helper = new PropertyPlaceholderHelper("$#", "#");
String text = "name=$#name#,age=$#age#";
Properties props = new Properties();
props.setProperty("name", "admin");
props.setProperty("age", "18");
String result = helper.replacePlaceholders(text, props);
Objects.equals(result, "name=admin,age=18");
}
/**
* 参数动态获取
* 应用场景:解析@pathvariable形式的请求的url(后面会写一个配置化的url调用,
比如某业务场景要调用不同的url,不同入参,不同出参,不同的请求方式,不同的请求头等)
*/
@Test
public void testDynamicValue() {
String text = "name=${name},age=${age}";
// placeholderResolver 根据占位符去获取动态值
String result = helper.replacePlaceholders(text, paramName -> {
// 这里的逻辑可交给SpringBean去动态调一些业务逻辑获取,这里简单的写个demo
switch (paramName) {
case "name":
return "admin";
case "age":
return "18";
}
return null;
});
System.out.println(result);
boolean equals = Objects.equals(result, "name=admin,age=18");
System.out.println(equals);
}
}