2013-08-22 110 views
0

我已經構建了一個應用程序與依賴框架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) {...} 
} 

當我將使用束甲任何其他類從導出的包,那麼我有沒有爲他們每個人設立一項服務?

什麼是解決捆綁內甚至捆綁邊界的依賴注入問題的常用方法?

回答

2

如果你獨立於使用Guice,我會推薦使用Eclipse + Bndtools來創建你的OSGi包。使用Bndtools,創建OSGi捆綁包以及通過註釋創建DI非常簡單。讓我們舉個例子:

您在bundleA有一個接口:

public interface Greeting { 
    String sayHello(String name); 
} 

在bundleB的實現,其中@Component使我們的捆綁使用OSGi聲明服務。

@Component 
public class ExampleComponent implements Greeting { 
    public String sayHello(String name) { 
     return "Hello " + name; 
    } 
} 

而在要美迪並注入所有Greeting實施爲使用特定組件結束第三bundleC。

@Component 
public class GreetingCommand { 
    private Greeting greetingSvc; 

    @Reference 
    public void setGreeting(Greeting greetingSvc) { 
     this.greetingSvc = greetingSvc; 
    } 

    public void greet(String name) { 
     System.out.println(greetingSvc.sayHello(name)); 
    } 
} 

正如你可以看到@Reference你表示要注入你的Greeting接口的實現。上述示例使用OSGi聲明式服務與Bndtools結合使用。 Bndtools本身需要註釋並創建OSGi使用聲明式服務所需的XML文件。我不想更深入地瞭解它。請參閱[1]和[2]瞭解更多信息。只是想告訴你如何使用聲明式服務和Bndtools來創建DI。

[1] http://bndtools.org/

[2] http://wiki.osgi.org/wiki/Declarative_Services

+0

christian,謝謝你的回答。但是如果我理解正確的話,bndtools只會爲聲明式服務生成xml,這可以被OSGi框架用於服務註冊。然後,我仍然遇到ExampleComponent(我的AA類)確實對它自己的包(AInternal)中的內部類有依賴性的問題。沒有無參數構造函數時,OSGi無法創建ExampleComponent。我可以使用額外的setter,但這是DI setter與構造函數注入的另一個故事/討論 – SimFirehawk

+0

接口描述在另一個bundle中。通常你不會把你的實現和你的接口放到同一個bundle中。因此,你只需要一個依賴項,比如說,API包和消費者具有相同的依賴關係,但從不包含到實現包中。因此,消費者從來沒有與實施本身直接相關,這就是DI想要解決的問題,對吧?! –

+0

我認爲不管接口描述是在同一個捆綁包還是另一個捆綁包都沒關係。即使接口在另一個包中,我們稱之爲AInterface,但實現AInterface的ExampleComponent(服務提供者)仍然會以某種方式由osgi框架實例化。但是ExampleComponent有一個額外的內部依賴。該框架無法實例化?我錯了嗎? – SimFirehawk

0

那麼,有稱爲Peaberry,其提供集成吉斯使用OSGi一個擴展庫。有很好的example如何將服務包注入到另一個包中。

希望你會發現它有幫助。