如何使用附加到Spring中当前应用程序上下文的环境初始化property-placeholder?

时间:2014-01-23 10:04:08

标签: java spring properties applicationcontext

我正在使用Spring Framework 3.2.6.RELEASE。

我正在尝试使用命令行界面(使用JOptCommandLinePropertySource)通过

设置属性
PropertySource<?> propertySource = new JOptCommandLinePropertySource(options);
final GenericApplicationContext context = new GenericApplicationContext();
context.getEnvironment().getPropertySources().addFirst(propertSource);
...

我有这个bean配置器:

package com.example;

@Configuration
public class AppConfig {
  @Value("${prop1}")
  private String prop1;

  @Bean
  public MyBean myBean() {
    MyBean ret = new MyBean();
    ret.init(prop1);
    return ret;
  }
}

我正在使用命令行参数启动我的程序: - prop1 = prop_value

如果我使用此xml进行初始化:

<beans>
  <context:annotation-config />
  <context:property-placeholder />
  <context:component-scan base-package="com.example" />
</beans>

然后我收到此错误:无法在字符串值“$ {prop1}”中解析占位符'prop1'

13:47:36.932 [main] DEBUG o.s.b.f.annotation.InjectionMetadata - Processing injected method of bean 'AppConfig': AutowiredFieldElement for private java.lang.String com.example.AppConfig.prop1
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AppConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.example.AppConfig.prop1; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'prop1' in string value "${prop1}"
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ~[spring-beans-3.2.6.RELEASE.jar:3.2.6.RELEASE]
...

但是使用这个xml一切正常:

<beans>
  <context:annotation-config />
  <context:component-scan base-package="com.example" />

  <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="environment" ref="environment" />
  </bean>
</beans>

为什么PropertySourcesPlaceholderConfigurer不检查Javadoc中定义的当前应用程序上下文环境?

  

PlaceholderConfigurerSupport的专业化,它针对当前的Spring环境及其PropertySources集解析bean定义属性值和@Value注释中的$ {...}占位符。

1 个答案:

答案 0 :(得分:2)

使用命名空间配置时,建议使用无版本的xsd。因此,建议使用http://www.springframework.org/schema/context/spring-context-2.5.xsd而不是http://www.springframework.org/schema/context/spring-context.xsd。这可以确保spring将使用类路径上最新版本的xsd。

关于<context:property-placeholder />关于默认配置,Spring 3.1中有一些,破坏(?)的变化。在Spring 3.1之前,system-properties-mode属性的默认值为 FALLBACK ,在Spring 3.1中导致创建PropertyPlaceholderConfigurer而不是PropertySourcesPlaceholderConfigurer。默认值在特定的xsd中配置。 (好像Spring 3.1它是 ENVIRONMENT )。

因此,使用较旧的xsd会导致属于xsd特定版本的默认行为,请切换到3.2 xsd或无版本的xsd。 (如前所述,建议使用后者)。