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
问题是,在自动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?