我有一个用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
但没有成功。
答案 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>
即使PropertyPlaceholderConfigurer
是BeanFactoryPostProcessor
并且应该首先进行instatninated,Spring首先创建someBean
。我想这是因为FactoryBean
需要它。
但是FactoryBean
本身稍后会创建。所以即时化的顺序是
当someBean
不是FactoryBean
的依赖时,这很荒谬并且正常工作。
我不明白为什么它会在WebApplicationContext
中发生并在集成测试中正常工作。