来自文件的Spring环境属性

时间:2013-01-08 20:52:25

标签: spring config

我正在试图弄清楚如何将属性文件的值放入我的Spring Environment属性中。

Spring Spring 3.1这样做的方式如下:

  <context:property-placeholder location="classpath:my.properties" />

  <bean id="myBean" class="com.whatever.MyBean">
    <property name="someValue" value="${myProps.value}" />
    <!-- etc -->
  </bean>

我本可以这样做:

public class MyBean {

   @Value(value = "#{myProps.value}")
   private String someValue;

}

现在我可以表面上从Environment类中提取属性,这似乎是一种更简洁的获取属性的方式,而不是在我的xml或my bean本身中使用笨重的#{myProps.value}语法。

我在我的XML中试过这个:

<bean
    class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="location">
        <value>classpath:my.properties</value>
    </property>
</bean>

但是这些属性没有添加到Environment。

我知道我可以使用PropertySource属性,但我没有使用注释进行配置。

那么如何设置我的bean / xml以便我的道具中的变量设置在环境中可用?此外,如何将这些值注入我的bean而不必明确说出“environmentInstance.getProperty(”myProps.value“)?

2 个答案:

答案 0 :(得分:1)

适用于网络应用

如果要在处理XML bean定义之前填充之前的环境,则应实现ApplicationContextInitializer(),如the Spring Source blog

中所述
<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>com.bank.MyInitializer</param-value>
</context-param>

以下是博客

中示例的略微修改版本
public class MyInitializer implements
        ApplicationContextInitializer<ConfigurableWebApplicationContext> {
    public void initialize(ConfigurableWebApplicationContext ctx) {
        ResourcePropertySource ps;
        try {
            ps = new ResourcePropertySource(new ClassPathResource(
                    "my.properties"));
        } catch (IOException e) {
            throw new AssertionError("Resources for my.properties not found.");
        }
        ctx.getEnvironment().getPropertySources().addFirst(ps);
    }
  }

对于独立应用程序

基本上相同的是,您可以直接修改AbstractApplicationContext的环境

   ResourcePropertySource ps;
   try {
        ps = new ResourcePropertySource(new ClassPathResource(
                        "my.properties"));
   }catch (IOException e) {
                throw new AssertionError("Resources for my.properties not found.");
   }
   //assuming that ctx is an AbstractApplicationContext
   ctx.getEnvironment().getPropertySources().addFirst(ps);

P.S。这个答案的早期版本显示了尝试从bean修改环境,但它似乎是在SO上传播的反模式,因为您确实希望在之前将填充环境属性源列表XmlBeanDefinitionReader开始处理XML以使占位符在<import/>语句中工作。

答案 1 :(得分:0)

我的理解也有点混乱,但这是我能说出来的:

  1. 环境是一种指示当前活动配置文件的方式(配置文件是一种选择性创建bean的方式)
  2. PropertySources可以与一个环境相关联,并且使用@PropertySource注释的方法就是这样做,似乎没有xml等效于这样做。
  3. 您的理解实际上应该反过来,AFAIK:当您声明<context:property-placeholder时,占位符将针对本地声明的属性解析属性并且可以回退到环境中声明的属性源,环境本身不会获得用新属性修改。同样,向环境本身添加属性的唯一方法似乎是通过@PropertySource注释