用Java

时间:2017-10-13 19:20:36

标签: 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内使用的表达式。

1 个答案:

答案 0 :(得分:3)

在运行时期间有一些不同的方法可以更改Spring属性。其中包括 EnvironmentPostProcessor ApplicationListener 。在这里,我将包括EnvironmentPostProcessor的一个例子。

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

    spring.factories

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

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