2013-07-31 52 views
0

在一個OSGi應用程序我有一個類層次結構如下:的getClass()在抽象類返回隨機實現類

public interface IA { 
    public void someMethod(); 
} 

public abstract class AbstractA implements IA { 
    public void someMethod(SomeObject s) { 
     System.out.println(this.getClass()); 
    } 
} 

public class ImplAA extends AbstractA { 
    //Some other methods 
} 

public class ImplAB extends AbstractA { 
    //Some other methods 
} 

接口,抽象類和實現是在4個不同的束。 另一束包含一個類看起來像這樣:

public class SomeClass { 

    private IA implAAInstance; 
    private IA implABInstance; 

    protected void bindToAA(IA ia) { 
     implAAInstance = ia; 
    } 

    protected void bindToAB(IA ia) { 
     implABInstance = ia; 
    } 

    protected void sendStuff(SomeObject p, SomeObject q) { 
     implAAInstance.someMethod(p); 
     implABInstance.someMethod(q); 
    } 
} 

方法bindToAAbindToAB可用於結合包含類ImplAAImplAB分別束綁定功能。 在XML組件定義這個看起來如下:

<reference bind="bindToAA" cardinality="0..1" interface="path.to.IA" name="ImplAA" policy="dynamic"/> 
<reference bind="bindToAB" cardinality="0..1" interface="path.to.IA" name="ImplAB" policy="dynamic"/> 

在包含ImplAAImplAB束,有一個在XML組件定義這一重要線:

<implementation class="path.to.ImplAA"/> 
<service> 
    <provide interface="path.to.IA"/> 
</service> 

<implementation class="path.to.ImplAB"/> 
<service> 
    <provide interface="path.to.IA"/> 
</service> 

現在的問題是,當我運行代碼時,會打印兩次使用ImplAA。 這是什麼原因?我怎樣才能讓它打印正確的實現類?

+1

大量信息丟失。您是否將ImplAA和ImplAB的實例發佈爲服務?你似乎在說'SomeClass'是DS組件,如果是的話,你的DS聲明是什麼樣的?據我目前所見,輸出沒有任何問題。你要求一個IA實例,而ImplAA是一個實例。有什麼問題? –

+0

我編輯了這個問題,確切的問題是我不想要一些IA的隨機實現類,我只想要一個我綁定的類。我希望現在的問題更清晰 – PieterDB

+0

您是否使用正常的java代碼嘗試了這種方法,只需使用沒有OSGI和綁定複雜性的Main方法即可。 –

回答

1

你在做什麼錯了沒有在你的xml文件中指定目標。

的解決方案將是一個屬性添加到您的AA類的名稱類型和值「AAA」,例如,調整在XML文件中的綁定參考如下:

<reference bind="bindToAA" target="(type=aaa)" cardinality="0..1" interface="path.to.IA" name="ImplAA" policy="dynamic"/> 

執行相同的您的其他服務,當您嘗試使用相同接口綁定到一組服務的特定服務時,可以使用LDAP過濾器使用目標/屬性區分它們。

有關LDAP過濾器的詳細信息: Info on LDAP filters

3

那麼,你綁定到IA ......並且有兩個IA服務(ImplAA和ImplAB)。那麼,爲什麼DS會爲bindToAA使用不同的服務實例而不是bindToAB呢?你只宣佈要求IA?

這兩種綁定方法都需要0或1個IA實例,因此兩種服務中的任何一種都與帳單相匹配,在這種情況下,最好只取一個,因爲requirer(SomeClass)似乎並不關心這種差異。

我腦海中沒有什麼大問題,爲什麼你要依賴實例呢? OSGi的全部目的是讓實例隱藏起來。如果你有一個依賴關係的需求,那麼表達這個,這是OSGi的方式。

不,如果你只是想打印服務,使基數MULTIPLE,並把服務列表。在這種情況下,您表達了對所有IA服務的興趣。