Spring在运行时添加占位符值

时间:2017-01-25 12:03:48

标签: java spring properties configuration applicationcontext

假设具有以下Spring配置,其中genericDirectory占位符在编译时未知:

@Configuration
@PropertySource("${genericDirectory}/additional.properties")
public class SomeConfiguration{
  //...
}

我尝试在刷新上下文之前添加属性,但仍然会出现异常

public static BeanFactory createContext(String genericDirectoryName) {
   AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

   PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();

   Properties props = new Properties();
   props.setProperty("genericDirectory", genericDirectoryName);

   configurer.setProperties(props);

   applicationContext.addBeanFactoryPostProcessor(configurer);

   applicationContext.register(SomeConfiguration.class);

   applicationContext.refresh(); // throws IllegalArgumentException: Could not resolve placeholder 'genericDirectory' 

   return applicationContext;
}

我还尝试在父上下文中设置属性,并通过setParent方法将其传递给子,但没有成功(得到相同的异常)。

请展示如何在运行时向ApplicationContext添加属性。

PS。在这种情况下,没有隐藏的配置 - 上下文是按原样手动创建的。

1 个答案:

答案 0 :(得分:1)

解决属性不是多遍过程。在@PropertySource中使用占位符时,只能根据环境变量或系统变量(将-D传递给您的程序)来解析这些占位符。

因此,不要只是简单地调用System.setProperty而不是现在所做的事情。

public static BeanFactory createContext(String genericDirectoryName) {
    System.setProperty("genericDirectory", genericDirectoryName);

   AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
   applicationContext.refresh(); 
   return applicationContext;
}

这应该让属性得到解决。

另外,要真正使@PropertySource工作,您还需要在配置中注册PropertySourcesPlaceHolderConfigurer