【问题标题】:How to programmatically use Spring's JdbcTemplate?如何以编程方式使用 Spring 的 JdbcTemplate?
【发布时间】:2009-11-22 16:35:49
【问题描述】:

我们使用 Spring 的 JdbcTemplate,它是通过 Spring config 配置的,如下图所示。有没有办法在不注入数据源的情况下做到这一点?我想以编程方式创建JdbcTemplate 实例并使用TheOracleDS“初始化”数据源。

我们当前的配置:

Java 类

private JdbcTemplate jdbcTemplate;

@Resource(name = "myDataSource")
public void setDataSource(DataSource dataSource) {
     this.jdbcTemplate = new JdbcTemplate(dataSource);
}

弹簧配置

<jee:jndi-lookup id="myDataSource" jndi-name="java:/TheOracleDS"/>

Oracle 数据源配置

<xa-datasource>
      <jndi-name>TheOracleDS</jndi-name>
      ...
</xa-datasource>

更新:我问这个的原因是我不完全相信依赖注入/让 Spring 管理 bean..

【问题讨论】:

  • 真正的问题是:为什么这里不需要注入?你提议买你的方式是什么?
  • 我之前使用 Spring JDBC 采用了非注入路线,但仅适用于我只想运行 main 方法来检查数据库中的内容的实用程序类。在这种情况下,编写 XML 并进行查找似乎有点矫枉过正。然而,一旦 JNDI 加入其中,似乎真的没有必要避免使用注入。

标签: java spring dependency-injection spring-jdbc


【解决方案1】:

这是我编写的项目中的一些示例代码:

SimpleJdbcTemplate db;
DataSource dataSource = new SingleConnectionDataSource(System.getProperty(
         "lingcog.db.connectstring"),
      System.getProperty("lingcog.db.username"),
      System.getProperty("lingcog.db.password"), false);

db = new SimpleJdbcTemplate(dataSource);

如果我使用注入,也许我的代码会更简单,但这是一个很好的例子,说明如何在不使用注入的情况下做到这一点。

您可以使用org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup 对象通过 JDNI 名称查找所需的数据源。

DataSource dataSource = new JndiDataSourceLookup().getDataSource("java:/TheOracleDS")
SimpleJdbcTemplate db=new SimpleJdbcTemplate(dataSource);

【讨论】:

    【解决方案2】:

    不确定您为什么要这样做,但是...您可以使用 Spring 的 JndiDataSourceLookup 查找 JDNI 数据源:

    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    lookup.setResourceRef(true); // if the lookup occurs in a J2EE container
    DataSource ds = lookup.getDataSource(jndiName);
    

    或者只是使用 Sun 的类执行“手动”查找:

    Context ctx = new InitialContext();
    DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
    

    然后,只需将数据源引用传递给JdbcTemplate 构造函数或调用setDataSource(ds)

    但是,正如我所说,我不知道你为什么不想使用注入。

    【讨论】:

      【解决方案3】:

      只需使用原始 JNDI 查找:

      public void setDataSourceName(String name) {
          InitialContext ctx = new InitialContext();
          jdbcTemplate = new JdbcTemplate((DataSource) ctx.lookup(name));
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-06
        • 2015-10-08
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2014-04-17
        • 2015-05-15
        • 1970-01-01
        相关资源
        最近更新 更多