我的java应用程序在application.property文件中定义了以下属性。
spring.datasource.url=jdbc:jtds:sqlserver://**mysystemName**/;instance=mydb;domain=DHC;trusted=true;
是否可以读取机器名称并将其添加到spring.data source.url中?应该动态加载mysystemName
。
任何读取和更新值运行时的方法?我正在寻找类似下面的东西。
spring.datasource.url=jdbc:jtds:sqlserver://${someMachineNameFromCode}/;instance=mydb;domain=DHC;trusted=true;
我不想阅读属性和格式并回写。我正在寻找一些我可以直接在application.properties
内使用的表达式。
答案 0 :(得分:3)
在运行时期间有一些不同的方法可以更改Spring属性。其中包括 EnvironmentPostProcessor 和 ApplicationListener 。在这里,我将包括EnvironmentPostProcessor的一个例子。
EnvironmentPostProcessor
,如下所示。 CustomEnvironmentPostProcessor
类查找应用程序配置属性。 "%%mysystemName%%"
匹配的子字符串模式的值的属性,则将其替换为服务器主机名。 META-INF/spring.factories
。org.springframework.boot.env.EnvironmentPostProcessor=\
com.basaki.config.CustomEnvironmentPostProcessor
spring:
datasource:
url: jdbc:jtds:sqlserver://%%mysystemName%%/;instance=mydb;domain=DHC;trusted=true;
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {
private static final String APPLICATION_CONFIGURATION_PROPERTIES =
"applicationConfigurationProperties";
private static final String SYSTEM_PATTERN = "%%mysystemName%%";
@Override
public void postProcessEnvironment(
ConfigurableEnvironment environment,
SpringApplication springApplication) {
MutablePropertySources sources = environment.getPropertySources();
Properties modifiedProps = new Properties();
if (sources.contains(APPLICATION_CONFIGURATION_PROPERTIES)) {
PropertySource<?> source = sources.get(
APPLICATION_CONFIGURATION_PROPERTIES);
if (source instanceof EnumerablePropertySource) {
EnumerablePropertySource target =
(EnumerablePropertySource) source;
for (String name : target.getPropertyNames()) {
Object value = target.getProperty(name);
if (value instanceof String) {
if (((String) value).contains(SYSTEM_PATTERN)) {
try {
String newValue = ((String) value).replaceAll(SYSTEM_PATTERN,
hostname());
modifiedProps.put(name, newValue);
} catch (UnknownHostException e) {
//do nothing
}
}
}
}
}
}
if (!modifiedProps.isEmpty()) {
sources.addFirst(new PropertiesPropertySource("customAppProperties",
modifiedProps));
}
}
public String hostname() throws UnknownHostException {
String hostName = InetAddress.getLocalHost().getHostName();
int index = hostName.indexOf(".local");
hostName = (index > 0) ? hostName.substring(0, index) : hostName;
return hostName;
}
}