2015-11-05 56 views
1

我已經是AEM開發者近一年的時間了。我知道AEM使用'聲明式服務組件框架'來管理OSGi組件的生命週期。OSGi:何時使用組件框架以及何時自己創建對象

考慮一個場景,當我從一個包中導出一個包並從另一個包中導入該包時,我可以在第二個包中的第一個包中創建類的對象。在這種情況下,這是一個進出口合同。
我的問題是,當我應該使用組件框架來管理我的對象的生命週期,以及何時通過在需要時創建它們來處理它自己。

回答

3

在一個理想的設計中,你會不是實際上能夠從導出的包創建對象;因爲該包只包含接口。這使得它成爲「純粹」合約(API)輸出。如果有可以直接實例化的類,那麼它們就是實現類。

一般來說,只導出純API並保持實現類隱藏是好得多的。主要有兩個原因:

  1. 實現類往往有下游依賴關係。如果你直接從實現類依賴實現類,那麼你會得到一個非常大而脆弱的依賴圖...並且最終該圖將包含一個循環。事實上,它幾乎是不可避免的。此時,您的應用程序不是模塊化的,因爲您無法單獨部署或更改其任何部分。

  2. 純粹的接口可以分析版本之間的兼容性。作爲API的使用者或提供者,您確切知道您可以支持哪些API版本,因爲API不包含可執行代碼。但是,如果您對實現類有依賴關係,那麼您從不知道何時會破壞兼容性,因爲破壞可能發生在可執行代碼的內部,您無法輕鬆進行分析。

3

如果你的對象是服務,那麼毫無疑問,它們必須是OSGi組件。對於其他事情,我的第一選擇是OSGi組件,除非它們是像數據持有者或類似的東西那樣的微不足道的對象。

如果一個對象需要配置或引用OSGi服務,那麼它顯然也是一個OSGi組件。

一般來說,IMO最好在服務中考慮並將包導出定義爲允許其他包使用包服務的最小值。除非bundle明顯是一個像commons-io這樣的可重用的庫(舉一個簡單的例子)。

相關問題