我希望在启动时将属性值注入Spring上下文。 我试图使用Spring 3.1的新环境和PropertySource功能来做到这一点。
在加载Spring上下文的类中,我定义了我自己的PropertySource类,如下所示:
private static class CustomPropertySource extends PropertySource<String> {
public CustomPropertySource() {super("custom");}
@Override
public String getProperty(String name) {
if (name.equals("region")) {
return "LONDON";
}
return null;
}
然后,我将此属性源添加到应用程序上下文:
ClassPathXmlApplicationContext springIntegrationContext =
new ClassPathXmlApplicationContext("classpath:META-INF/spring/ds-spring-intg-context.xml");
context.getEnvironment().getPropertySources().addLast( new CustomPropertySource());
context.refresh();
context.start();
在我的一个bean中,我尝试访问属性值:
@Value("${region}")
public void setRegion(String v){
...
}
bur收到以下错误:
java.lang.IllegalArgumentException:引起: java.lang.IllegalArgumentException:无法解析占位符 字符串值中的'region'[$ {region}]
非常感谢任何帮助
答案 0 :(得分:1)
当您将XML文件位置作为构造函数参数传递给ClassPathXmlApplicationContext(..)
时,它会立即执行context.refresh()/context.start()
方法。因此,通过传入XML位置,您实际上是在一次传递中完成所有操作,并且在您调用context.getEnvironment().getPropertySources...
时已经开始/加载了上下文。
试试这个;
ClassPathXmlApplicationContext springIntegrationContext =
new ClassPathXmlApplicationContext();
context.getEnvironment().getPropertySources().addLast( new CustomPropertySource());
context.setLocations("classpath:META-INF/spring/ds-spring-intg-context.xml");
context.refresh();
它会设置您的来源,然后您的xml,然后启动应用程序上下文。