Spring:如何使用GenericDao获取多个数据源?

我有一个使用Spring 3.1.1的Web应用程序。 我们有一个使用JdbcTemplate的genericDao。 Datasource在GenericDaoImpl中这样注入。

public class GenericDaoImpl implements GenericDao { protected Class entityClass; protected JdbcTemplate jdbcTemplate; @Autowired public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } .... @Override public List findAll(String sql, ParameterizedRowMapper mapper, Object... args) { return jdbcTemplate.query(sql, mapper, args); } } 

这是一个简单的DAO。

 @Repository public class ElementDaoImpl extends GenericDaoImpl implements ElementDao { private static ParameterizedRowMapper mapper = new ParameterizedRowMapper() {...}; public List findChildren(int id) { sql = "SELECT...."; return findAll(sql, mapper, new Object[] {id}); } } 

目前,凭借独特的数据源,它可以完美运行。 applicationContext配置了注释。

        

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

我在服务中使用@Transactionnal。 我在spring文档中读到,我们可以为事务提供限定符,以便选择好的事务管理器。

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

               

在我的新服务上,我已将值添加到@Transactionnal注释中:

  @Transactionnal("txSecond") 

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

我创建了一个Junit测试,但是暂时,我阻止了一个exception:NoSuchBeanDefinitionException:no定义了javax.sql.DataSource类型的唯一bean。 预期单匹配bean但找到2(firstDs,SecondDs)。

我认为pb是genericDao但不确定。

如何管理?

谢谢。

在配置文件中的每个bean上手动设置dataSource

    

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

问题是,在自动assembly数据源时,您尚未指定任何限定符。

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

}

因此,如果您需要同一类中的两个数据源,请使用两个不同的setter注入来配置它们,并在每种情况下提供适当的限定符。

默认情况下,autowired注释按bean的类型映射,因此必须使用限定符(“bean id”) ,以便当config xml中存在多个相同类型的bean时,spring容器知道要连接哪个bean。

有比添加限定符更优雅的解决方案。

Spring:如何隐藏dependency injection的bean?

自动assembly两个实现相同接口的bean – 如何将默认bean设置为autowire?