2009-11-22 4 views
6

Мы используем Spring JdbcTemplate, который сконфигурирован с помощью конфигурации Spring, как показано ниже. Есть ли способ сделать это без ввода источника данных? Я хотел бы просто создать экземпляр JdbcTemplate программно и «инициализировать» источник данных, используя TheOracleDS.Как программно использовать Spring JdbcTemplate?

Наша текущая конфигурация:

Java класс

private JdbcTemplate jdbcTemplate; 

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

Spring конфиг

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

Oracle DataSource конфигурации

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

Update: Причина Я спрашиваю, что это я не верю в общей инъекции зависимостей/имея Spring управлять бобы ..

+3

Реальный вопрос: почему инъекции не желательно здесь? Что делает это так, как вы предлагаете купить вас? – duffymo

+2

Я отправил маршрут без инъекции раньше с Spring JDBC, но только для служебных классов, где я просто хочу запустить основной метод, чтобы проверить что-то в базе данных. В этом случае запись XML и его просмотр кажутся немного излишними. Однако, как только JNDI находится в миксе, кажется, что на самом деле нет случая избежать использования инъекций. –

ответ

3

Просто используйте сырые JNDI поиск:

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

Вот некоторые примеры кода из проекта я написано:

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

Может быть, мой код будет проще, если бы я использовал инъекции, но это хороший пример того, как сделать это без использования инъекций.

Вы можете использовать объект org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup, чтобы найти источник данных по имени JDNI.

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

Не знаю, почему вы хотите сделать это, но ... вы могли бы LookUp источника данных JDNI с Спрингом JndiDataSourceLookup:

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

Или просто выполнить «вручную» поиск с использованием классов от Sun:

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

Затем просто передайте ссылку на источник данных на конструктор JdbcTemplate или позвоните по телефону setDataSource(ds).

Но, как я уже сказал, я понятия не имею, почему вы не хотите использовать инъекции.

Смежные вопросы