背景:
原本已经完成的工程,需要重新从另一个数据库不间隔式的抽取一部分数据,到原本工程配置的数据库中,没有好的办法,只想到利用多数据源的方式抽取。
问题:
不能改动原工程的代码,原工程配置的使用Spring JDBC作为数据库连接,工程中有@Autowired和@Resource注解注入bean。
解决:
// 原工程数据源
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
//...省略空间等配置
<property name="filters" value="stat" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
<constructor-arg index="0" ref="dataSource" />
</bean>
// 配置数据源
<bean id="dataSource4bwp" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${jdbc.url4bwp}"/>
<property name="username" value="${jdbc.username4bwp}"/>
<property name="password" value="${jdbc.password4bwp}"/>
//...省略空间等配置
</bean>
<bean id="jdbcTemplate4bwp" class="org.springframework.jdbc.core.JdbcTemplate" autowire-candidate="false">
<constructor-arg index="0" ref="dataSource4bwp" />
</bean>
如果没有添加autowire-candidate="false" 属性,Spring IoC容器在加载bean并注入时会不知道实例化哪个bean(因为有jdbcTemplate和dataSource4bwp两个);添加autowire-candidate="false" 属性,容器则不会把这个bean作为候选bean,当需要使用时用
@Resource(name="jdbcTemplate4bwp")指定即可(使用@Autowired或加@Qualifier("jdbcTemplate4bwp")指定均不可以)。注意:这里的name是<bean>标签中的id属性。