Spring 3.1环境和PropertySource的基本用法

时间:2013-08-11 10:18:37

标签: spring spring-environment

我希望在启动时将属性值注入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}]

非常感谢任何帮助

1 个答案:

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