2009-11-22 31 views
6

Chúng tôi sử dụng số JdbcTemplate của Spring được định cấu hình thông qua cấu hình Spring như được minh họa bên dưới. Có cách nào để làm điều này mà không cần tiêm nguồn dữ liệu? Tôi chỉ muốn tạo một cá thể JdbcTemplate theo chương trình và "initalize" nguồn dữ liệu bằng cách sử dụng TheOracleDS.Làm thế nào để lập trình sử dụng JdbcTemplate của Spring?

cấu hình hiện tại của chúng tôi:

lớp Java

private JdbcTemplate jdbcTemplate; 

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

mùa xuân cấu hình

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

Oracle nguồn dữ liệu cấu hình

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

Cập nhật: Lý do tôi yêu cầu này là tôi không phải là một tổng tín đồ trong dependency injection/có mùa xuân quản lý đậu ..

+3

Câu hỏi thực sự là: tại sao là tiêm không mong muốn ở đây? Điều gì đang làm nó theo cách bạn đang đề xuất mua bạn? – duffymo

+2

Tôi đã đi con đường không tiêm trước với Spring JDBC, nhưng chỉ cho các lớp tiện ích mà tôi chỉ muốn chạy một phương pháp chính để kiểm tra một cái gì đó trong cơ sở dữ liệu. Trong trường hợp đó viết một XML và tìm kiếm nó có vẻ hơi quá mức. Tuy nhiên, một khi JNDI đang trong hỗn hợp, có vẻ như không có trường hợp nào để tránh sử dụng thuốc tiêm. –

Trả lời

3

Chỉ cần sử dụng một tra cứu JNDI liệu:

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

Dưới đây là một số mẫu mã từ một dự án tôi đã được viết:

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); 

Có thể mã của tôi sẽ đơn giản hơn nếu tôi sử dụng tiêm, nhưng đây là ví dụ tốt về cách thực hiện điều này mà không cần tiêm.

Bạn có thể sử dụng đối tượng org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup để tìm nguồn dữ liệu bạn muốn theo tên JDNI.

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

Không chắc lý do tại sao bạn muốn làm điều đó nhưng ... bạn có thể tra cứu các nguồn dữ liệu JDNI với JndiDataSourceLookup Spring:

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

Hoặc chỉ cần thực hiện một "bằng tay" tra cứu sử dụng các lớp học của Sun:

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

Sau đó, chỉ cần chuyển tham chiếu nguồn dữ liệu tới hàm tạo JdbcTemplate hoặc gọi setDataSource(ds).

Nhưng, như tôi đã nói, tôi không biết tại sao bạn không muốn sử dụng tiêm.

Các vấn đề liên quan