我有一个类EntityLoader
用于使用 Hibernate 从 MySQL 数据库中获取一些数据。但现在需要从两个不同的数据库(本例中为 MySQL 和 Oracle)获取数据。所以我想要两个豆子,但每个豆子都EntityLoader
注入不同的豆子。SessionFactory
EntityLoader
定义如下:
package com.demo
@Component
public class EntityLoader {
@Autowired
private SessionFactory sessionFactory;
/* Code ... */
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
上下文配置是:
<context:component-scan base-package="com.demo" />
<bean id="mysqlSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
到目前为止,它工作正常。为此,我做了以下更改:
- 排除
EntityLoader
以component-scan
避免自动创建 EntityLoader - 添加
mysqlSessionFactory
和oracleSessionFactory
bean 定义 - 添加
mysqlEntityRepoLoader
和oracleEntityRepoLoader
bean 定义
请注意,mysqlEntityRepoLoader
我oracleEntityRepoLoader
已经添加了属性autowired="no"
,希望这会告诉 Spring 不要自动装配SessionFactory
并使用定义的 ref。
生成的配置是:
<context:component-scan base-package="com.demo">
<context:exclude-filter type="regex" expression="com.demo.EntityLoader"/>
</context:component-scan>
<bean id="mysqlSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- ... config ... -->
</bean>
<bean id="oracleSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- ... config ... -->
</bean>
<bean id="mysqlEntityRepoLoader" class="com.dome.imserso.api.core.data.EntityRepoLoader" autowire="no">
<property name="sessionFactory" ref="mysqlSessionFactory"/>
</bean>
<bean id="oracleEntityRepoLoader" class="com.dome.imserso.api.core.data.EntityRepoLoader" autowire="no">
<property name="sessionFactory" ref="oracleSessionFactory"/>
</bean>
但似乎 SpringSessionFactory
在任何情况下都首先尝试自动装配。我收到以下错误:
没有定义 [org.hibernate.SessionFactory] 类型的限定 bean:预期的单个匹配 bean 但找到 2:mysqlSessionFactory,oracleSessionFactory
如果我删除@Autowired
所有工作正常。但我想维护它,因为此代码是用于其他应用程序的通用库的一部分,通常情况下仅从一个数据库加载。
有没有办法在不删除注释的情况下完成它?