Я знаю, что вы сказали, что не хотите получать его из контекста xml, но я не вижу простого и не хрупкого способа обойти это.
В Spring 2.0 и более поздних версиях вы можете использовать элемент <util:property-path />
для ссылки на свойство другого компонента. Допустим, ваш DataSource
объявлен так (примечание: я буду использовать p-namespace
для краткости):
<bean id="dataSource" class="com.example.SimpleDataSource"
p:user="db_user"
p:password="letmein"
p:driverClass="com.example.CabDriver"
p:jdbcUrl="jdbc:example:@localhost:1729:magicdb" />
Я предполагаю, что ваш JdbcTemplate
используется некоторым объектом доступа к данным. Допустим, это выглядит так:
public class SimpleDao implements ExampleDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
}
Итак, конфигурация Spring для создания этого DAO выглядит так:
<bean id="dao" class="com.example.SimpleDao"
p:dataSource-ref="dataSource" />
Теперь к нашей проблеме: как получить свойство JdbcUrl
в нашем DAO? Давайте добавим сеттер:
public class SimpleDao implements ExampleDao {
private String jdbcUrl;
// ...
public void setJdbcUrl(String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
// ...
И, наконец, мы вводим это, используя вышеупомянутый элемент <util:property-path />
:
<bean id="dao" class="com.example.SimpleDao"
p:dataSource-ref="dataSource">
<property name="jdbcUrl>
<util:property-path path="dataSource.jdbcUrl" />
</property>
</bean>
URL-адрес доступен из bean-компонента с именем dataSource
с использованием getJdbcUrl
(обратите внимание, что он находится на конкретном источнике данных, а не на интерфейсе), поэтому элемент property-path указывает Spring получить значение оттуда и использовать его в качестве значения свойства DAO.
Это не слишком много кода (это один установщик и одно дополнительное свойство), и вы всегда будете иметь одно и то же значение, введенное в оба bean-компонента.