java - PropertyPlaceholderConfigurers 在参数化 DataSource bean 之后加载

标签 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 是否总是先于其他 bean 初始化?有没有办法确保 PropertyPlaceholderConfigurer 在所有其他 bean 之前加载?

最佳答案

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

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

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

参见this related post了解更多详情

关于java - PropertyPlaceholderConfigurers 在参数化 DataSource bean 之后加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923979/

相关文章:

java无法从同一个类中获取静态变量的值

java - 证明 A == B, B==C, A != C

java - 维度对象的优点和缺点?

java - 使用 Apache Bcel 获取注释名称

java - Spring 3.0 MVC 绑定(bind)枚举大小写敏感

python - 如何在类定义的*外部*定义 Python 属性?

javascript - 使用 jQuery 的 .prop 方法将属性设置为函数

java - Spring MVC 中的可选路径段

Spring Web应用程序在启动时从数据库初始化

properties - Gradle额外属性在子项目中定义的自定义任务中不可见