2011-07-27 278 views
8

我有這種情況下,我有三個聲明式服務,提供相同的接口(說讀者界面,我有readerimpl1-數據庫readerimpl2-平文件readerimpl3內存)。我想要一個只綁定到數據庫實現的使用者。在組件定義中,我們給它起一個名字,所以我很確定名稱在註冊表中,所以如果我要添加一個激活方法,我可以使用名稱從組件上下文中查找。Osgi聲明性服務條件綁定

我想嘗試通過綁定/解除綁定,但使用服務名稱作爲參數。我很確定組件引用元素中的「目標」參數可以用來做到這一點,但我還沒有找到如何使用它。

有沒有其他人這樣做?

這將是類似於使用 @Reference(映射名= 「foo」 的)

+0

這是一個真正有趣的問題。它讓我想到了如果你喜歡*數據庫impl但是會接受另一個的相關問題。在這種情況下,您可以通過@Reference(cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,policy = ReferencePolicy.DYNAMIC)實現,然後在添加/刪除方法中篩選列表。 –

回答

14

目標是簡單地一個OSGi filter。您可以使用它來過濾任何服務屬性。所以,如果你的服務與價值filedatabase命名爲backend屬性,你可以用下面的目標約束:

<scr:reference ... target="(backend=database)"/> 

並與數據庫後端服務本身將被記錄爲:

<scr:component ...> 
    ... 
    <property name="backend" type="String" value="database"/> 
</scr:component>