我現在正在使用OSGi服務,並且在OSGi中有關於使用服務的問題。有一些不同的方式來註冊用戶服務。任何人都可以解釋OSGi服務跟蹤器和聲明式服務之間的區別嗎?哪一個更好?OSGi服務跟蹤器和聲明式服務有什麼不同
回答
在OSGi中ServiceTracker的是獲取對服務的引用的程序化方式。即您編寫ServiceTracker代碼來「跟蹤」對另一個服務的引用,並讓它在可用時使用它。
相比之下,聲明式服務(DS)允許您聲明注入到組件中的依賴關係。因此,DS是依賴注入的一種形式。服務之間的依賴關係圖及其啓動順序將決定您的服務何時啓動。 DS定義中的基數屬性允許您聲明關係是強制性的(1..1),具有至少一個(1..n),可選的(0..1)或多個可選的(0..n )。 當您聲明強制關係時,只有滿足所有依賴關係,您的服務纔會啓動。 當您聲明可選關係時,無論依賴關係的狀態如何,您的服務都將啓動,但您需要注意代碼中對您的服務的引用可能爲空。
從實際的角度來看,ServiceTracker是很多可以編寫和維護的樣板代碼。鑑於OSGi服務的動態特性,OSGi規範允許有許多州需要考慮。 DS會爲您提供一種乾淨的方式來聲明和維護您的依賴關係。良好定義的依賴關係將幫助您保持運行時環境的一致性。
OSGi服務跟蹤器讓您爲某些服務註冊偵聽器,以便您可以在該服務可用時做出反應。
另一方面,聲明性服務隱式地使用服務跟蹤器來延遲捆綁激活代碼的執行,直到解決服務依賴關係。
哪一個更好?
這是很簡單的創建和使用一些聲明式服務,特別是與Apache費利克斯SCR註釋和Apache費利克斯SCR Maven插件:
https://felix.apache.org/site/scr-annotations.html
https://felix.apache.org/site/apache-felix-maven-scr-plugin-use.html
聲明性服務(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一樣。
- 1. 聲明式OSGi服務
- 2. OSGi聲明式服務和彈簧
- 3. OSGi JAX-RS和bnd聲明式服務
- 4. JAVA OSGi:聲明式服務的InstantiationException
- 5. OSGi聲明式服務注入
- 6. 使用OSGi的聲明式服務
- 7. OSGi聲明性服務引用非聲明性服務
- 8. 跟蹤服務器同步狀態
- 9. 不跟蹤WCF服務(診斷跟蹤)
- 10. Osgi聲明性服務條件綁定
- 11. 的Websphere的OSGi:聲明服務
- 12. 業務邏輯:EJB與OSGi聲明式服務
- 13. OSGi聲明性服務與ManagedService配置服務?
- 14. 有沒有辦法輕鬆跟蹤多個OSGi服務?
- 15. OSGi/Felix聲明式服務:如何過濾要綁定的服務?
- 16. 服務工廠實現使用的聲明式服務在OSGi的
- 17. 獲取使用OSGi聲明式服務的服務實現列表
- 18. OSGI:什麼是等待聲明式服務組件啓動的最佳方法?
- 19. OSGI聲明式服務(DS):什麼是使用服務組件實例的好方法
- 20. Workflow Foundation 4.0 - 事務服務和SQL跟蹤服務?
- 21. 爲什麼OSGi聲明性服務(DS)註釋不是從超類繼承的?
- 22. 服務組件架構和聲明式服務組件模型
- 23. OSGI DS:聲明式服務無xml文件工作
- 24. 訪問java項目中的osgi聲明式服務
- 25. 在JUnit測試環境中使用OSGi聲明式服務
- 26. OSGi聲明式服務 - 通過綁定方法獲取ServiceReference
- 27. OSGi聲明式服務在運行時過濾引用
- 28. 使用聲明式服務在OSGi + Pax-Web中GWT的問題
- 29. OSGi聲明式服務 - 空指針異常
謝謝大家。所有的答案都很有用。但我只能選擇一個 –