【问题标题】:Inject BasicDataSource at runtime with spring使用 spring 在运行时注入 BasicDataSource
【发布时间】:2016-08-17 22:04:19
【问题描述】:

我使用spring来访问数据库:

  • XML Spring 上下文:

    <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">...</bean> <bean id="jdbcTmp" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="ds" /> </bean> <bean id="myDao" class="MyDao"> <property name="jdbcTemplate" ref="jdbcTmp" /> </bean>

  • 代码:

    System.out.println("There is : " + new ClassPathXmlApplicationContext("beans.xml").getBean("myDao").countRowsInTheDB() + " rows in this source";

这很简单,而且效果很好。但是我想在运行时根据一个变量在不同的数据库之间进行选择。

类似:

ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); int rows1 = ctx.getBean("myDao", "dataSource1").countRowsInTheDB(); int rows2 = ctx.getBean("myDao", "dataSource2").countRowsInTheDB();

最简单的方法是什么?

我想为每个源创建一个 XML 配置:

 <bean id="myDao1" class="MyDao"><property name="data" ref="jdbcTmpForDataSource1" /></bean>
 <bean id="myDao2" class="MyDao"><property name="data" ref="jdbcTmpForDataSource2" /></bean>

然后写代码:

 int i = getDataSourceIndex();
 ctx.getBean("myDao" + i).countRowsInTheDB();

【问题讨论】:

    标签: java spring dependency-injection datasource jdbctemplate


    【解决方案1】:

    创建第二个数据源,jdbc模板,dao:

    <bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource">...   </bean>
    <bean id="jdbcTmp2"   class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource" ref="ds2" />
    </bean>
    <bean id="myDao2" class="MyDao">
     <property name="jdbcTemplate" ref="jdbcTmp2" />
    

    创建一个 bean,即所有数据源的列表

    只需自动插入,spring 将注入列表

    @Autowired List<DataSource> dataSources;
    

    在您的代码中遍历列表并随心所欲地使用数据源。

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2014-12-11
      • 2017-09-16
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多