2009-11-22 21 views
6

Wir verwenden Spring JdbcTemplate, die konfiguriert wird über Spring Config wie unten dargestellt. Gibt es eine Möglichkeit, dies zu tun, ohne die Datenquelle zu injizieren? Ich möchte nur die JdbcTemplate Instanz programmatisch erstellen und die Datenquelle mit TheOracleDS "initialisieren".Wie programmiere ich Spring JdbcTemplate?

Unsere aktuellen config:

Java-Klasse

private JdbcTemplate jdbcTemplate; 

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

Frühling Config

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

Oracle-Datenquelle Config


aktualisieren: Grund Ich frage dies, ich bin kein Gesamt Gläubiger in Dependency Injection/mit Spring-Beans verwalten ..

+3

Die eigentliche Frage ist: Warum ist die Injektion hier nicht erwünscht? Was macht es so, wie Sie es vorhaben, Sie zu kaufen? – duffymo

+2

Ich habe die Nicht-Injektion Route zuvor mit Spring JDBC, aber nur für Utility-Klassen, wo ich nur eine Hauptmethode ausführen möchten, um etwas in der Datenbank zu überprüfen. In diesem Fall scheint es etwas übertrieben, XML zu schreiben und nachzuschlagen. Sobald jedoch JNDI in der Mischung ist, scheint es wirklich keinen Fall zu geben, die Injektion zu vermeiden. –

Antwort

3

Verwenden Sie einfach einen rohen JNDI-Lookup:

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

Hier einige Beispiel-Code aus einem Projekt, das ich habe geschrieben:

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

Vielleicht wäre mein Code einfacher, wenn ich Injektion verwendet, aber dies ist ein gutes Beispiel dafür, wie diese Injektion, ohne zu tun.

Sie können ein Objekt org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup verwenden, um die gewünschte Datenquelle anhand des JDNI-Namens zu finden.

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

nicht sicher, warum Sie das tun wollen, aber ... Sie die JDNI Datenquelle mit JndiDataSourceLookup Spring Nachschlag könnte:

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

Oder einfach nur ein „Handbuch“ Lookup über Suns Klassen durchführen:

Dann übergeben Sie einfach die Datenquellenreferenz an den JdbcTemplate Konstruktor oder rufen Sie setDataSource(ds).

Aber wie gesagt, ich habe keine Ahnung, warum Sie keine Injektion verwenden wollen.

Verwandte Themen