Como usar programaticamente o JDBCTemplate da Spring?
-
21-09-2019 - |
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 ..
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);