Ich verwende den folgenden Trick. Wenn Sie ein "target"-Attribut auf dem Servicereferenz spezifizieren, aber seinen Wert als leeren String belassen, wird zur Laufzeit eine Komponenteneigenschaft mit demselben Namen, aber einem Suffix ".target" verwendet.
In dem untenstehenden Beispiel wähle ich meine JDBC-Quelle dynamisch über eine .cfg-Datei in meinem Karaf-Container aus. Die Eigenschaft "datasourcefactory.target" wird automatisch in das "target"-Attribut des "datasourcefactory"-Verweises injiziert.
Warnung: Ich weiß eigentlich nicht, ob dieser Trick offiziell unterstützt wird oder nur ein Feature von Felix SCR ist. Ich wollte das schon immer im Spezifikation nachschlagen, um zu sehen, ob es erwähnt wird... +1 für jeden Kommentar, der seine Rechtmäßigkeit erläutert!
@Component(
name = "...",
specVersion = "1.1",
policy = ConfigurationPolicy.REQUIRE,
metatype = true
)
@Property(name = "dataSourceFactory.target",
value = "",
label = "dataSourceFactory target",
description = "Ein OSGi-Servicefilter zur Auswahl des Datenquellenanbieters. "+
"Zum Beispiel: '(&(osgi.jdbc.driver.name=derby)(objectClass=org.osgi.service.jdbc.DataSourceFactory))' wobei 'derby' der wichtige Teil ist und der Rest Standardcode ist. "+
"Siehe DataSourceFactory.OSGI_JDBC_DRIVER_(NAME,CLASS,VERSION)."
)
@Reference(
name = "dataSourceFactory",
referenceInterface = org.osgi.service.jdbc.DataSourceFactory.class,
cardinality = ReferenceCardinality.MANDATORY_UNARY,
target = "", // muss überschrieben werden durch Konfigurationseigenschaft mit dem Namen "dataSourceFactory.target"
bind = "bindDataSourceFactory",
unbind = "unbindDataSourceFactory"
)