PropertyPlaceholderConfigurers在参数化DataSource bean之后加载

时间:2015-06-18 19:20:35

标签: java spring properties spring-mybatis

在我的应用程序上下文的顶部,我声明了一个PropertyPlaceholderConfigurer

...
<context:annotation-config/>

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

稍后,我声明一个数据源bean,该属性由该属性文件

中的属性参数化
<bean id="someDataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
    <property name="connectionCachingEnabled" value="true"/>
    <property name="URL" value="${database.url}"/>
    <property name="user" value="${database.user}"/>
    <property name="password" value="${database.password}"/>
</bean>

在部署期间,我注意到在初始化PropertyPlaceholderConfigurer之前,已创建数据源bean并尝试建立连接。这导致我的数据源参数化不会被填充。

知道为什么会这样吗?

是否有针对bean的特定创建顺序?某些豆子是否总是先于其他豆子初始化?有没有办法确保在所有其他bean之前加载PropertyPlaceholderConfigurer?

2 个答案:

答案 0 :(得分:1)

事实证明,我定义的一个bean是mybatis的MapperScannerConfigurer,它引用了一个sqlSessionFactory。

MapperScannerConfigurer可以在任何PropertyPlaceholderConfigurer之前初始化,如果它已使用不推荐的bean属性初始化

要纠正行为,必须使用不同的bean属性引用sqlSessionFactory。

有关详细信息,请参阅this related post

答案 1 :(得分:0)

您需要在<context:property-placeholder location="classpath:foo.properties"/>

之前移动<context:annotation-config/>

<context:property-placeholder location="classpath:foo.properties"/> <context:annotation-config/>