2017-05-04 13 views
3

残念ながら、解決済みの参照でプログラムでosgiサービスを作成する方法が見つかりませんでした。 OSGiはシングルトンオブジェクトとしてサービスを作成することはよく知られている事実です。何らかの理由で、新しいサービスインスタンスを手動で作成する必要があります。OSGIサービスをプログラムでプログラムで作成できますか?

場合:

@Service(ICasualService.class) 
@Component(immediate = true, label = "Casual Service") 
public class CasualService implements ICasualService { 

    @Reference 
    private ConfigurationAdmin configurationAdmin; 
} 

バンドルコンテキストを使用したが、私は私のサービスを登録することができる午前:

private BundleContext bundleContext; 
ICasualService casualService = new CasualService(); 
Dictionary props = new Properties(); 
bundleContext.registerService(ICasualService.class.getName(), casualService, props); 

しかし、このようconfigurationAdminは新しい作成されたサービスでnullです。

質問は、サービスの新しいインスタンスをプログラムで作成できるかどうかです。

ありがとうございます。

UPDATE:ソリューションはFelix(OSGi実装)で動作するはずです。

答えて

5

ComponentFactoryを使用すると、コンポーネントのインスタンスを作成できます。 this article at Vogellaを参照してください。

使用このあなたがプログラムで作成するコンポーネント上:

@Component(factory="fipro.oneshot.factory") 

続いて別のコンポーネントにあなたがComponentFactory得ることができます。

@Reference(target = "(component.factory=fipro.oneshot.factory)") 
    private ComponentFactory factory; 

をし、それからインスタンスを作成します。

ComponentInstance instance = this.factory.newInstance(null); 
OneShot shooter = (OneShot) instance.getInstance(); 
+0

ありがとうございます!できます。さらに、この方法で適切な設定パラメータを持つ新しいサービスをthis.factory.newInstance(Dictionary)メソッドに渡すことで作成することができます。 2.サービスの新しいインスタンスを作成します(.newInstance(null)の場合、毎回同じオブジェクトを返します)。 –

関連する問題