如何使bean.xml中配置的多数据源在控制器Class1中可用?
让Class1控制器用上所有配置的数据源/ JdbcTemplate
嘿,看你现在的配置是给每个JdbcTemplate单独创建了一个Class1实例,但如果你想在同一个Class1对象里访问所有数据源对应的JdbcTemplate,不用搞多个实例,按下面的步骤改就行:
第一步:修改Class1类,准备接收多个JdbcTemplate
这里有两种方式,看你需求选:
方式一:逐个声明属性(适合数据源数量固定的情况)
在com.controller.Class1里,给每个需要的JdbcTemplate加属性和setter方法——Spring靠setter来注入:
public class Class1 { // 对应各个数据源的JdbcTemplate private JdbcTemplate xxxbcTemplate; private JdbcTemplate xxxbbTemplate; private JdbcTemplate yyybcTemplate; private JdbcTemplate yyybbTemplate; // 每个属性的setter方法,必须要有 public void setXxxbcTemplate(JdbcTemplate xxxbcTemplate) { this.xxxbcTemplate = xxxbcTemplate; } public void setXxxbbTemplate(JdbcTemplate xxxbbTemplate) { this.xxxbbTemplate = xxxbbTemplate; } public void setYyybcTemplate(JdbcTemplate yyybcTemplate) { this.yyybcTemplate = yyybcTemplate; } public void setYyybbTemplate(JdbcTemplate yyybbTemplate) { this.yyybbTemplate = yyybbTemplate; } // 之后在方法里就能直接用了 public void doSomeDBOperation() { // 用xxxcctemplate操作xxxbc库 xxxbcTemplate.query("SELECT * FROM some_table", ...); // 用xxxbbtemplate操作xxxbb库 xxxbbTemplate.update("UPDATE another_table SET ...", ...); // 其他数据源同理 } }
方式二:用Map统一管理(新增数据源不用改类,更灵活)
如果以后可能加新的数据源,这种方式更省心——Spring会自动把所有JdbcTemplate bean塞到Map里:
import org.springframework.jdbc.core.JdbcTemplate; import java.util.Map; public class Class1 { // key是JdbcTemplate的bean id,value是实例 private Map<String, JdbcTemplate> jdbcTemplateMap; public void setJdbcTemplateMap(Map<String, JdbcTemplate> jdbcTemplateMap) { this.jdbcTemplateMap = jdbcTemplateMap; } public void doSomeDBOperation() { // 通过bean id拿对应的JdbcTemplate JdbcTemplate xxxbcTemplate = jdbcTemplateMap.get("xxxcctemplate"); JdbcTemplate xxxbbTemplate = jdbcTemplateMap.get("xxxbbtemplate"); // 操作数据库... } }
第二步:修改bean.xml配置,把所有JdbcTemplate注入到同一个Class1实例里
先把原来的class1、class2、class3、class4这四个bean删掉,只留一个Class1的bean,然后注入所有需要的JdbcTemplate:
对应方式一的配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd "> <!-- 保留所有数据源和JdbcTemplate的配置,注意修正了xxxcctemplate的ref笔误(原来写的xxxcc,实际是xxxbc) --> <bean id="xxxbc" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="username" value="xxxbc" /> <property name="url" value="jdbc:mysql://localhost:3306/xxxbc" /> <property name="password" value="xxxbc" /> </bean> <bean id="xxxbb" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="username" value="xxxbb" /> <property name="url" value="jdbc:mysql://localhost:3306/xxxbb" /> <property name="password" value="xxxbb" /> </bean> <bean id="yyybc" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="username" value="yyybc" /> <property name="url" value="jdbc:mysql://localhost:3306/yyybc" /> <property name="password" value="yyybc" /> </bean> <bean id="yyybb" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="username" value="yyybb" /> <property name="url" value="jdbc:mysql://localhost:3306/yyybb" /> <property name="password" value="yyybb" /> </bean> <bean id="xxxcctemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="xxxbc"></property> </bean> <bean id="xxxbbtemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="xxxbb"></property> </bean> <bean id="yyybctemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="yyybc"></property> </bean> <bean id="yyybbtemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="yyybb"></property> </bean> <!-- 只保留一个Class1 bean,注入所有JdbcTemplate --> <bean id="class1" class="com.controller.Class1"> <property name="xxxcctemplate" ref="xxxcctemplate"></property> <property name="xxxbbtemplate" ref="xxxbbtemplate"></property> <property name="yyybctemplate" ref="yyybctemplate"></property> <property name="yyybbtemplate" ref="yyybbtemplate"></property> </bean> </beans>
对应方式二的配置:
同样删掉多个Class1的bean,只留一个,Spring会自动把所有JdbcTemplate类型的bean注入到Map中:
<!-- 其他数据源和JdbcTemplate配置不变 --> <bean id="class1" class="com.controller.Class1"> <!-- 不用写ref,Spring自动把所有JdbcTemplate bean塞到这个Map里,key就是bean的id --> <property name="jdbcTemplateMap"></property> </bean>
小提醒
- 你原来的
xxxcctemplate配置里,ref写的是xxxcc,但实际数据源的bean id是xxxbc,这明显是笔误,我在上面的配置里已经修正了,记得改过来,不然会报错找不到bean。 - 如果不想用JdbcTemplate,想直接用
DataSource,也可以用同样的思路:在Class1里声明多个DataSource属性,或者用Map<String, DataSource>接收,然后自己创建JdbcTemplate就行。
内容的提问来源于stack exchange,提问作者Explain Down Vote
相关产品推荐
相关产品推荐

