Je sais que vous avez dit que vous ne vouliez pas avoir à l'obtenir à partir du contexte xml, mais je ne peux pas voir un moyen facile et non-fragile autour d'elle.
Au printemps 2.0 et supérieur, vous pouvez utiliser le <util:property-path />
element pour référencer une propriété d'un autre bean. Disons que votre DataSource
est déclarée comme si (note: Je vais utiliser le p-namespace
tout au long de la brièveté):
<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" />
Je suppose que votre JdbcTemplate
est utilisé par un objet d'accès aux données. Disons qu'il ressemble à ceci:
public class SimpleDao implements ExampleDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
}
Ainsi, la configuration de printemps pour construire ce OAC est comme ceci:
<bean id="dao" class="com.example.SimpleDao"
p:dataSource-ref="dataSource" />
maintenant à notre problème: comment obtenir la propriété JdbcUrl
dans notre DAO? Ajoutons un poseur:
public class SimpleDao implements ExampleDao {
private String jdbcUrl;
// ...
public void setJdbcUrl(String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
// ...
Et enfin nous injectons cela en utilisant l'élément <util:property-path />
mentionné ci-dessus:
<bean id="dao" class="com.example.SimpleDao"
p:dataSource-ref="dataSource">
<property name="jdbcUrl>
<util:property-path path="dataSource.jdbcUrl" />
</property>
</bean>
L'URL est disponible à partir de la fève nommée dataSource
en utilisant getJdbcUrl
(notez que ceci est sur le DataSource en béton , pas l'interface), donc l'élément property-path dit à Spring d'obtenir la valeur à partir de là et de l'utiliser comme valeur pour la propriété DAO.
Ce n'est pas trop de code (c'est un setter et une propriété supplémentaire) et vous aurez toujours la même valeur injectée dans les deux beans.
Quelle mise en œuvre de DataSource utilisez-vous? Quelque chose comme c3p0? – jasonmp85