在Java中更新应用程序属性
我的java应用程序在我的application.property文件中定义了以下属性在Java中更新应用程序属性,java,spring,Java,Spring,我的java应用程序在我的application.property文件中定义了以下属性 spring.datasource.url=jdbc:jtds:sqlserver://**mysystemName**/;instance=mydb;domain=DHC;trusted=true; 是否可以读取机器名并将其添加到spring.data source.url中?应动态加载mysystemName 有没有读取和更新运行时值的方法?我在找下面这样的东西 spring.datasource.ur
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;
我不想读取属性和格式并写回。我正在寻找一些可以直接在
应用程序中使用的表达式。properties
有几种不同的方法可以在运行时更改Spring属性Environment后处理器和ApplicationListener就是其中之一。这里,我将包括一个EnvironmentPostProcessor示例
环境后处理器
,如下所示李>
CustomEnvironmentPostProcessor
类查找应用程序配置属性李>
“%%mysystemName%%”匹配的子字符串模式,则会将其替换为服务器主机名李>
修改后的特性存储在占位符中李>
如果放置的修改特性保持架不是空的,则会将其添加到所有其他特性的开头李>
您还必须在META-INF/spring.factories
中注册该类
春季工厂
application.yml
CustomEnvironmentPostProcessor.java
公共类CustomEnvironmentPostProcessor实现EnvironmentPostProcessor{
私有静态最终字符串应用程序\u配置\u属性=
“应用程序配置属性”;
私有静态最终字符串SYSTEM_PATTERN=“%%mysystemName%%”;
@凌驾
公共空间后处理环境(
可配置的环境,
Spring应用程序(Spring应用程序){
MutablePropertySources sources=environment.getPropertySources();
Properties modifiedProps=新属性();
if(sources.contains(应用程序配置属性)){
PropertySource=sources.get(
应用程序(配置)(属性);;
if(EnumerablePropertySource的源实例){
EnumerablePropertySource目标=
(EnumerablePropertySource)源;
for(字符串名称:target.getPropertyNames()){
对象值=target.getProperty(名称);
if(字符串的值实例){
if(((字符串)值).contains(系统_模式)){
试一试{
字符串newValue=((字符串)值).replaceAll(系统_模式,
主机名());
modifiedProps.put(名称,newValue);
}捕获(未知后异常e){
//无所事事
}
}
}
}
}
}
如果(!ModifiedOps.isEmpty()){
sources.addFirst(新属性PropertySource(“customAppProperties”),
(p),;
}
}
公共字符串hostname()引发UnknownHostException{
字符串hostName=InetAddress.getLocalHost().getHostName();
int index=hostName.indexOf(“.local”);
主机名=(索引>0)?主机名。子字符串(0,索引):主机名;
返回主机名;
}
}
更改数据源url似乎很奇怪,因此我需要问您为什么要这样做。无论如何:这可能有助于复制
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;
}
}