DSで参照を使用する場合、必要なサービスインスタンスを絞り込むことができるターゲットを指定できます。問題は、すべての例がコード時に実行する必要のある静的クエリを示していることです。動的クエリを実行する方法はありますか(構成管理者からプロパティを取得する可能性があります)?
DSがこれをサポートしていない場合、これをサポートする別のOSGi依存性注入フレームワーク(ブループリント、iPojoなど)はありますか?
DSで参照を使用する場合、必要なサービスインスタンスを絞り込むことができるターゲットを指定できます。問題は、すべての例がコード時に実行する必要のある静的クエリを示していることです。動的クエリを実行する方法はありますか(構成管理者からプロパティを取得する可能性があります)?
DSがこれをサポートしていない場合、これをサポートする別のOSGi依存性注入フレームワーク(ブループリント、iPojoなど)はありますか?
参照のターゲット属性をいつでも使用して、第1レベルのフィルターを実行できます。bindメソッドに署名がある場合
void <method-name>(<parameter-type>, Map);
次に、サービスプロパティを含むマップに対して任意の動的フィルターを実行できます。フィルタが一致しない場合は、そのコンポーネントを無視できます(当面の間)。
別の方法として、コンポーネントの構成に参照のターゲットフィルターを含めることができるため、コンポーネントの構成を変更してターゲットフィルターを変更できます。
私は次のトリックを使用します。サービス参照で「target」属性を指定し、その値を空の文字列のままにすると、実行時に同じ名前で「.target」サフィックスを持つコンポーネントプロパティが使用されます。
以下の例では、Karafコンテナ内の.cfgファイルを介してJDBCソースを動的に選択します。「datasourcefactory.target」プロパティは、「datasourcefactory」参照の「target」属性に自動的に挿入されます。
警告:このトリックが公式にサポートされているのか、FelixSCR機能だけなのかは実際にはわかりません。私はそれが言及されているかどうかを確認するために仕様でこれを調べることを意味してきました...その合法性を明確にするコメントに+1!
@Component(
name = "...",
specVersion = "1.1",
policy = ConfigurationPolicy.REQUIRE,
metatype = true
)
@Property(name = "dataSourceFactory.target",
value = "",
label = "dataSourceFactory target",
description = "An OSGi service filter to select the data source provider. "+
"For example: '(&(osgi.jdbc.driver.name=derby)(objectClass=org.osgi.service.jdbc.DataSourceFactory))' where 'derby' is the important bit and the rest is boilerplate. "+
"See DataSourceFactory.OSGI_JDBC_DRIVER_(NAME,CLASS,VERSION)."
)
@Reference(
name = "dataSourceFactory",
referenceInterface = org.osgi.service.jdbc.DataSourceFactory.class,
cardinality = ReferenceCardinality.MANDATORY_UNARY,
target = "", // must be overwritten by configuration property named "dataSourceFactory.target"
bind = "bindDataSourceFactory",
unbind = "unbindDataSourceFactory"
)