2009-11-22 15 views
6

Usamos Spring's JdbcTemplate que se configura a través de Spring config como se ilustra a continuación. ¿Hay alguna manera de hacer esto sin inyectar la fuente de datos? Me gustaría simplemente crear la instancia JdbcTemplate programáticamente e "initalizar" la fuente de datos usando TheOracleDS.¿Cómo se usa programáticamente JdbcTemplate de Spring?

Nuestra configuración actual:

clase Java

private JdbcTemplate jdbcTemplate; 

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

config primavera

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

Oracle fuente de datos de configuración

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

actualización: Razón por la que estoy pidiendo esto es que no soy un creyente en el total de la inyección de dependencias/tener Primavera gestionar los granos ..

+3

La verdadera pregunta es: ¿por qué no es deseable la inyección aquí? ¿Qué está haciendo de la forma en que propones comprarte? – duffymo

+2

He pasado la ruta de no inyección antes con Spring JDBC, pero solo para las clases de utilidad donde solo quiero ejecutar un método principal para verificar algo en la base de datos. En ese caso, escribir un XML y buscarlo parece un poco exagerado. Sin embargo, una vez que JNDI está en la mezcla, parece que realmente no hay un caso para evitar el uso de la inyección. –

Respuesta

3

sólo tiene que utilizar una búsqueda JNDI prima:

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

He aquí algunos ejemplos de código de un proyecto que he escrito:

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

Tal vez mi código sería más sencillo si utiliza la inyección, pero esto es un buen ejemplo de cómo hacer esto sin necesidad de utilizar la inyección.

Puede usar un objeto org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup para encontrar la fuente de datos que desea por nombre JDNI.

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

No estoy seguro de por qué quiere hacer eso, pero ... se puede buscar el origen de datos JDNI con JndiDataSourceLookup de primavera:

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

O simplemente realizar una búsqueda "manual" el uso de clases de Sun:

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

Luego, solo pase la referencia del origen de datos al constructor JdbcTemplate o llame al setDataSource(ds).

Pero, como dije, no tengo idea de por qué no quieres usar la inyección.

Cuestiones relacionadas