You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:37:40