我已經構建了一個應用程序與依賴框架Guice。現在我將轉移到OSGI,並開始用捆綁信息擴展我的罐子。依賴注入與OSGI
我目前面臨的主要問題是如何正確設置依賴注入。我有捆綁軟件A,它導出一些軟件包。然後Bundle B定義了一個組件,它需要注入一個bundle A的一些對象(class AA)。
我可以爲bundle A中的AA類設置一個服務,這個服務會自動注入,但是如果bundle A對bundle A中的某個類也有依賴關係,可能不會導出。我是否必須將第二類設置爲服務,這不起作用,因爲它不會導出。
下面的代碼將顯示該問題:
捆綁
package test.bundleA.api
public class AA {
@Inject
public AA(AInternal someReference) {...}
}
package test.bundleA.internal
public class AInternal {...}
束B:
package test.bundleB.api
public class ComponentB {
@Inject
public ComponentB(AA refToA) {...}
}
當我將使用束甲任何其他類從導出的包,那麼我有沒有爲他們每個人設立一項服務?
什麼是解決捆綁內甚至捆綁邊界的依賴注入問題的常用方法?
christian,謝謝你的回答。但是如果我理解正確的話,bndtools只會爲聲明式服務生成xml,這可以被OSGi框架用於服務註冊。然後,我仍然遇到ExampleComponent(我的AA類)確實對它自己的包(AInternal)中的內部類有依賴性的問題。沒有無參數構造函數時,OSGi無法創建ExampleComponent。我可以使用額外的setter,但這是DI setter與構造函數注入的另一個故事/討論 – SimFirehawk
接口描述在另一個bundle中。通常你不會把你的實現和你的接口放到同一個bundle中。因此,你只需要一個依賴項,比如說,API包和消費者具有相同的依賴關係,但從不包含到實現包中。因此,消費者從來沒有與實施本身直接相關,這就是DI想要解決的問題,對吧?! –
我認爲不管接口描述是在同一個捆綁包還是另一個捆綁包都沒關係。即使接口在另一個包中,我們稱之爲AInterface,但實現AInterface的ExampleComponent(服務提供者)仍然會以某種方式由osgi框架實例化。但是ExampleComponent有一個額外的內部依賴。該框架無法實例化?我錯了嗎? – SimFirehawk