春季:如何让多个数据源与GenericDao?(Spring : how to get multip

2019-08-02 14:56发布

我有使用Spring 3.1.1 Web应用程序。 我们使用的JdbcTemplate一个genericDao。 数据源是注射这样的GenericDaoImpl。

public class GenericDaoImpl<T extends Serializable> implements GenericDao<T> {

protected Class<T> entityClass;

protected JdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

....

@Override
public List<T> findAll(String sql, ParameterizedRowMapper<T> mapper, Object... args) {
    return jdbcTemplate.query(sql, mapper, args);
}

}

这是一个简单的DAO。

@Repository
public class ElementDaoImpl extends GenericDaoImpl<Element> implements ElementDao {

    private static ParameterizedRowMapper<Element> mapper = new ParameterizedRowMapper<Element>() {...};

    public List<Element> findChildren(int id) {
        sql = "SELECT....";
        return findAll(sql, mapper, new Object[] {id});
    }

}

对于时刻,具有独特的数据源,它可以正常使用。 ApplicationContext已配置了注释。

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>

现在,我必须整合仍然使用genericDao一个新的DAO,但在另一个数据库(所以另一个数据源)工作。

我用的是@Transactionnal服务。 和我读到关于春天的文档,我们可以给一个限定的交易,以选择良好的事务管理器。

所以,我创建了一个新的数据源,一个新的事务管理器...

<bean id="firstDS" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>

<bean id="secondDS" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="firstDS"/>
</bean>

<bean id="txManagerSecond" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="secondDS"/>
    <qualifier value="txSecond"/>
</bean>

<tx:annotation-driven proxy-target-class="true"/>

而在我的新服务,我已经增值到@Transactionnal注释:

 @Transactionnal("txSecond")

要恢复,我有4类来管理新的数据库:接口服务,与@Transactionnal(“txSecond”),接口DAO的基础上,为genericDao DAO实现其对注入数据源创建一个JdbcTemplate对象服务的实现。

我创建了一个JUnit测试,但此刻,我阻断异常:NoSuchBeanDefinitionException:类型为javax.sql.DataSource的没有唯一的bean定义。 预计单匹配豆却发现2(firstDs,SecondDs)。

我认为,PB是genericDao但不能确定。

如何管理?

谢谢。

Answer 1:

手动设置你的每个bean的数据源中的配置文件

<bean id="elementDao" class="ElementDaoImpl" autowire="byName">
   <property name="datasource" ref="datasource2">
</bean>

另一个解决方法:用“别名”玩http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#beans-java-bean-别名



Answer 2:

问题是,尽管自动装配的数据源,你没有指定任何限定。

 @Autowired


public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);

}

所以,如果你在同一类既需要你的数据源,配置它们使用两种不同的二传手注射和在各种情况下提供适当的限定词。



Answer 3:

默认情况下,通过bean的类型自动装配注释地图所以一个个有使用限定词(“豆ID”)为了让Spring容器知道bean来电线时配置XML存在相同类型的多个豆。



Answer 4:

还有更优雅的解决方案不是增加预选赛。

春季:如何隐藏依赖注入豆?

自动装配的两个bean实现相同的接口-如何设置默认的bean自动装配?



文章来源: Spring : how to get multiple datasource with GenericDao?