Java Spring在运行时添加占位符值

Java Spring在运行时添加占位符值,java,spring,properties,configuration,applicationcontext,Java,Spring,Properties,Configuration,Applicationcontext,假设具有以下Spring配置,其中genericDirectory占位符在编译时未知: @Configuration @PropertySource("${genericDirectory}/additional.properties") public class SomeConfiguration{ //... } 我试图在刷新上下文之前添加属性,但仍然得到异常 public static BeanFactory createContext(String genericDirectory

假设具有以下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添加属性


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

解析属性不是一个多过程。在
@PropertySource
中使用占位符时,这些占位符仅根据环境变量或系统变量(随
-D
传递给程序的变量)进行解析

因此,与其做现在所做的事情,不如简单地调用
System.setProperty

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

   AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
   applicationContext.refresh(); 
   return applicationContext;
}
这将允许解析属性


此外,要使
@PropertySource
真正起作用,还需要在配置中注册
propertysourcesplaceconfigurer

那是行不通的。
@PropertySource
注释中的占位符仅针对环境变量和系统变量解析,而不针对其他属性解析。因此,您需要使用
System.setProperty
对其进行设置,才能对其进行解析。或者不使用
@PropertySource
而是根据传入的属性手动添加
ResourcePropertySource
。@M.Denium,非常感谢
System.setProperty
也是一种可接受的方式。如果你希望这个评论能成为一个答案。