java - 在 Java 中更新应用程序属性

标签 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.url=jdbc:jtds:sqlserver://${someMachineNameFromCode}/;instance=mydb;domain=DHC;trusted=true;

我不想读取属性和格式并回写。我正在寻找一些可以直接在 application.properties 中使用的表达式。

最佳答案

有几种不同的方法可以在运行时更改 Spring 属性。 EnvironmentPostProcessorApplicationListener 就在其中。在这里,我将包含一个 EnvironmentPostProcessor 示例。

  1. 创建自定义 EnvironmentPostProcessor,如下所示。
  2. CustomEnvironmentPostProcessor 类查找应用程序配置属性
  3. 如果它发现任何属性的值包含匹配 "%%mysystemName%%" 的子字符串模式,它会将其替换为服务器主机名。
  4. 修改后的属性存储在占位符中。
  5. 如果修改后的属性placed holder不为空,则将其添加到所有其他属性的开头。
  6. 您还必须在 META-INF/spring.factories 中注册该类。

Spring 工厂

org.springframework.boot.env.EnvironmentPostProcessor=\
  com.basaki.config.CustomEnvironmentPostProcessor

应用程序.yml

spring:
  datasource:
    url: jdbc:jtds:sqlserver://%%mysystemName%%/;instance=mydb;domain=DHC;trusted=true;

CustomEnvironmentPostProcessor.java

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;
    }
}

关于java - 在 Java 中更新应用程序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46736711/

相关文章:

linux - Ubuntu 14.04 LTS 磁盘中的 ${user.home}

java - 需要在Java中使用eclipse获取MongoDB中的一个字段

java - 透明的介绍覆盖层向用户介绍应用程序

java - 延迟任务:scheduler first execution in Spring 3

java - Spring Cloud Config Server 环境变量的优先级

java - 为什么我不能输入空值?

java - 如果要从需要 api key 的 Web 服务检索数据,如何使用 Spring?

java - Android AudioRecord.stop()导致崩溃

java - 奇怪的行为类型

java - 搜索一个数字并将其删除在我的 int 变量中