2012-04-27 43 views
6

當我使用DS我可以指定一個目標,讓我縮小我想要的服務實例的引用。問題是,所有示例都顯示必須在代碼時間完成的靜態查詢。有沒有辦法做一個動態查詢(可能從配置管理拉入屬性)?動態目標的查詢與DS

如果DS不支持此有另一種OSGi的依賴注入框架(藍圖,iPojo等),將支持呢?

回答

7

您可以隨時使用的參考目標屬性,一[執行第一級過濾器。該如果你的綁定方法有簽名

void <method-name>(<parameter-type>, Map); 

然後你就可以運行在其中包含了服務性質的地圖的任何動態過濾器。如果過濾器不匹配,您可以忽略該組件(暫時)。

在備用中,由於組件的配置可以包含引用的目標過濾器,因此您可以修改組件的配置以更改目標過濾器。

+0

我玩了你的第一個建議,它似乎會適合我們的需要就好了。謝謝。 – rancidfishbreath 2012-04-27 21:15:19

5

我使用以下技巧。如果指定的服務引用了「目標」屬性,但保留了其作爲空字符串值,然後用相同的名字,但「.TARGET」後綴組件屬性會在運行時使用。

在下面的例子中,我選擇我的JDBC源動態經由在我Karaf容器.cfg文件。 「datasourcefactory.target」屬性被自動注入到「datasourcefactory」引用的「target」屬性中。

警告:我真的不知道如果這招被正式支持只是一個費利克斯SCR功能。我一直想要在規範中查看它,看看它是否被提及......對任何意見進行+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" 
    ) 
+5

OSGi 4.2 Service Compendium的第112.3.4節提到:*「部署人員還可以通過爲設置目標屬性值的組件建立一個配置來設置目標屬性,這允許部署者覆蓋目標屬性的目標屬性組件說明「。* - 這是官方功能。 – 2012-05-03 06:22:24

+0

謝謝,@BjörnPollex! – 2012-05-03 12:36:50