在初始化一些bean之后触发PropertySourcesPlaceholderConfigurer

时间:2015-03-18 17:09:12

标签: java spring

我有一个用XML配置的自定义PropertySourcesPlaceholderConfigurer。 然后我有一个自定义XML bean定义

<bean id="propertySourceProducer" class="PropertySourcesProducer" />

<bean id="someProperties" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="propertySources">
          <bean factory-bean="propertySourceProducer" factory-method="createPropertySources" />
    </property>
</bean>

<bean id="someBean" class="package.SomeBean">
    <property name="someProp" value="${placeholder.val}" />
</bean>

问题是someBean.someProp设置为${placeholder.val}

我耐心地运行调试器,似乎在构造PropertySourcesPlaceholderConfigurer之前构造了someBean。然后它访问BeanDefinitions并找到${placeholder.val}的正确值。但为时已晚。

有趣的是,它在集成测试环境(稍微不同的配置)中工作正常。

我尝试在depends-on="someProperties"定义中设置someBean但没有成功。

1 个答案:

答案 0 :(得分:0)

似乎Spring中存在错误/功能。 我尝试了另一种方法,将数据库加载到java.util.Properties并传递给<context:property-placeholder>。同样的结果。

问题似乎有所不同。

我的bean someBean是一个简单的普通bean。但它是FactoryBean的依赖(在配置中不可见)。

<bean id="otherBean" class="this.is.implementation.of.FactoryBean">
   <property name="dependency" ref="someBean" />
</bean> 

即使PropertyPlaceholderConfigurerBeanFactoryPostProcessor并且应该首先进行instatninated,Spring首先创建someBean。我想这是因为FactoryBean需要它。

但是FactoryBean本身稍后会创建。所以即时化的顺序是

  • 数据源
  • someBean(缺少属性)
  • propertySourceProducer,PropertySourcesPlaceholderConfigurer
  • FactoryBean和所有其他bean

someBean不是FactoryBean的依赖时,这很荒谬并且正常工作。

我不明白为什么它会在WebApplicationContext中发生并在集成测试中正常工作。