PropertyPlaceholderConfigurers 在参数化 DataSource bean 之后加载

PropertyPlaceholderConfigurers loading after parameterized DataSource bean

在我的应用程序上下文的顶部,我声明了一个 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 是否总是在其他 bean 之前初始化?有没有办法确保 PropertyPlaceholderConfigurer 在所有其他 bean 之前加载?

您需要将 <context:property-placeholder location="classpath:foo.properties"/> 移到 <context:annotation-config/>

前面

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

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

MapperScannerConfigurer 可以在任何 PropertyPlaceholderConfigurer 之前初始化,如果它是使用已弃用的 bean 属性初始化的话

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

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