2015-05-04 20 views
2

如果我有一個服務A被某個其他組件(稱爲B)引用,那麼B對A的引用將變爲null?在聲明式服務中。當服務被停用時,何時刪除引用?

- 在A的停用方法被調用之前?

- 調用A的停用方法後,完成?

- 對象的實例被銷燬後?

我經歷了彙編規範,但是我找不到這方面的細節。如果有人能爲我澄清,我會很感激。

另外,當服務A被激活時,它是否被注入爲引用B?激活方法之前或之後?

回答

5

這個問題有兩個答案,這取決於您是使用靜態還是動態策略引用。我會先介紹靜態策略。

在激活期間,靜態策略保證將在激活方法之前調用將要調用的所有綁定方法。請注意,如果任何引用是可選的,那麼綁定可能根本不會被激活。但DS在關係(根據Java內存模型JSR133)執行以便激活方法可以安全地依賴靜態策略引用的綁定方法期間設置的任何字段的值,而無需顯式同步。

對於靜態策略,如果任何綁定的服務不可用,則必須停用該組件。 DS再次確保在調用任何解除綁定方法之前調用並完成停用方法。 (請注意,很少有任何需要爲靜態引用實現解除綁定的方法...如果您的組件有任何清理工作,那麼在停用方法中更容易完成)。

現在,事情變得更加複雜的動態政策。對於動態+強制引用,仍然保證在激活方法啓動之前已經調用了綁定方法,但是在所有投注都關閉之後。實際上可以調用綁定/解除綁定(甚至多次!)期間執行的激活方法。

另外請確保您參考了112.5.10節(「綁定服務替換」),它描述了bind/unbind被調用的順序。它起初可能並不直觀 - 新服務的綁定在之前被稱爲,而不是舊服務的綁定 - 但是當您考慮它時非常合理,因爲它確保強制引用永遠不會爲空。

+0

謝謝尼爾。這非常有用。只需要清楚一個問題。看起來你在被激活的組件中引用了服務,而不是引用了*被激活的組件。 即。如果B具有對A的動態和可選參考,B何時會獲得或無法訪問A? – santiagozky

+0

如果B具有A的動態/可選參考,那麼B將在A服務發佈時「獲得」(綁定)到A,並在A服務未發佈時解除綁定。從B的角度來看,A沒有必要成爲另一個DS組件,它只是一個OSGi服務。但是,如果將A *作爲DS組件實施,則其服務將在激活後發佈。 –

+0

謝謝尼爾。這很清楚。 – santiagozky

1

就我所知,您得到的保證是在停用方法結束後刪除引用。

+0

對於具有靜態策略的引用,這是正確的。 –

相關問題