Pergunta

Usamos a primavera JdbcTemplate que é configurado através da Spring Config, como ilustrado abaixo. Existe uma maneira de fazer isso sem injetar a fonte de dados? Eu gostaria de apenas criar o JdbcTemplate Instância programaticamente e "Infitalizar" a fonte de dados usando TheOracleDS.

Nossa configuração atual:

Classe Java

private JdbcTemplate jdbcTemplate;

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

Config da primavera

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

Oracle DataSource Config

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

Atualizar: Razão que estou perguntando que não acredito total na injeção de dependência / tendo feijão de gerenciamento de primavera ..

Foi útil?

Solução

Basta usar uma pesquisa JNDI bruta:

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

Outras dicas

Não sei por que você quer fazer isso, mas ... você pode procurar o JDNI DataSource com a Spring's JndiDataSourceLookup:

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

Ou apenas execute uma pesquisa "manual" usando as aulas do Sun:

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

Em seguida, basta passar na referência do DataSource ao JdbcTemplate construtor ou chamada setDataSource(ds).

Mas, como eu disse, não tenho idéia de por que você não quer usar injeção.

Aqui está algum código de exemplo de um projeto que escrevi:

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

Talvez meu código seja mais simples se eu usasse injeção, mas este é um bom exemplo de como fazer isso sem usar a injeção.

Você pode usar um org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup Objeto de encontrar a fonte de dados que você deseja pelo nome JDNI.

DataSource dataSource = new JndiDataSourceLookup().getDataSource("java:/TheOracleDS")
SimpleJdbcTemplate db=new SimpleJdbcTemplate(dataSource);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top