2012-06-11 59 views
10

我現在正在使用OSGi服務,並且在OSGi中有關於使用服務的問題。有一些不同的方式來註冊用戶服務。任何人都可以解釋OSGi服務跟蹤器和聲明式服務之間的區別嗎?哪一個更好?OSGi服務跟蹤器和聲明式服務有什麼不同

+0

謝謝大家。所有的答案都很有用。但我只能選擇一個 –

回答

14

在OSGi中ServiceTracker的是獲取對服務的引用的程序化方式。即您編寫ServiceTracker代碼來「跟蹤」對另一個服務的引用,並讓它在可用時使用它。

相比之下,聲明式服務(DS)允許您聲明注入到組件中的依賴關係。因此,DS是依賴注入的一種形式。服務之間的依賴關係圖及其啓動順序將決定您的服務何時啓動。 DS定義中的基數屬性允許您聲明關係是強制性的(1..1),具有至少一個(1..n),可選的(0..1)或多個可選的(0..n )。 當您聲明強制關係時,只有滿足所有依賴關係,您的服務纔會啓動。 當您聲明可選關係時,無論依賴關係的狀態如何,您的服務都將啓動,但您需要注意代碼中對您的服務的引用可能爲空。

從實際的角度來看,ServiceTracker是很多可以編寫和維護的樣板代碼。鑑於OSGi服務的動態特性,OSGi規範允許有許多州需要考慮。 DS會爲您提供一種乾淨的方式來聲明和維護您的依賴關係。良好定義的依賴關係將幫助您保持運行時環境的一致性。

+1

DS - 聲明式服務 – Robin

+0

@Robin我總是在頭腦中混合這個縮寫 - 更正。 – maasg

3

OSGi服務跟蹤器讓您爲某些服務註冊偵聽器,以便您可以在該服務可用時做出反應。

另一方面,聲明性服務隱式地使用服務跟蹤器來延遲捆綁激活代碼的執行,直到解決服務依賴關係。

4

聲明性服務(DS)非常易於使用,您可以避免與使用ServiceTracker相關的一些樣板代碼。如果你使用OSGI,只使用ServiceTracker,你需要關注OSGI服務動態性的一些方面。服務可以來來去去,你的組件需要處理它。如果你使用DS,大部分工作已經完成。您只需定義對其他服務的引用,DS會在引用這些引用時注入這些引用。當滿足組件要求時,DS會激活您的組件。

如果使用Apache Felix SCR註釋或bndlib提供的註釋,則還可以避免編寫聲明性服務所需的xml。最近OSGI小組也發佈了他們的一個註釋。我認爲bndlib提供的和OSGI提供的非常相似,我幾乎可以肯定bnd工具可以處理兩者。

前段時間我使用了Apache SCR註釋,但現在我更喜歡使用bndlib,因爲它包含了對Metatype的註釋和一些使得託管服務的實現更容易的類。 Metatype是與Managed Services相關的規範。基本上,它提供了Config Admin實現可以使用的元數據,以便爲組件的配置提供更友好的用戶界面。

我知道另外兩種選擇:iPojo和Blueprint。

iPojo功能非常強大,功能豐富。它抽象了大部分OSGI的東西,幷包含一些很好的功能,如EventAdmin支持和ConfigAdmin支持。

我用了Blueprint了一下,但由於過度使用xml,我不太喜歡它。我想你可能會說Blueprint就像OSGI的Spring一樣。

相關問題