0

我想在启动时将属性值注入 Spring 上下文。我正在尝试使用 Spring 3.1 的新 Environment 和 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}] 中的占位符“区域”

任何帮助是极大的赞赏

4

1 回答 1

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,然后启动应用程序上下文。

于 2013-08-11T10:51:33.330 回答