9

ほとんどの場合、OSGi宣言型サービスによって注入される同じクラスを持つコンポーネントがたくさんあります。これらのサービスは、すべての派生コンポーネントで同じロジックを実行するために使用されます。したがって、コードの重複を避けるために、抽象クラスを使用するのが最善です。DI参照メソッド(設定/設定解除)を抽象クラスに移動する可能性はありますか?私はBndを使用しています。

例えば:

@Component 
public class B implements IA {
   private ServiceC sc;

   @Reference
   public void setServiceC(ServiceC sc) {
      this.sc = sc;
   }  

   public void execute() {
      String result = executeSomethingDependendOnServiceC();

      // do something with result
   }

   protected String executeSomethingDependendOnServiceC() {
      // execute some logic
   }     
}

@Component 
public class D implements IA {
   private ServiceC sc;

   @Reference
   public void setServiceC(ServiceC sc) {
      this.sc = sc;
   } 

   public void execute() {
      String result = executeSomethingDependendOnServiceC();

      // do something different with result
   }

   protected String executeSomethingDependendOnServiceC() {
      // execute some logic
   }      
}

ServiceCのセッターとメソッドexecuteSomethingDependendOnServiceC()を抽象クラスに移動したいと思います。しかし、Bndアノテーションに関連するOSGiではどのように見えますか。抽象クラスのさまざまなインスタンスを作成し、@ Componentもインスタンスを作成するためA、@Componentでクラスにアノテーションを付けるだけでは機能しません。D

誰かが同じ問題を経験し、回避策がどのように見えるかについてアドバイスをくれるかもしれません。少なくともベストプラクティスの解決策も問題ありません:)

4

1 に答える 1

5

DSアノテーションは、コンポーネントに対してインスタンス化されるクラスに存在する必要があります。スーパークラスのアノテーションはサポートされていません。将来のスペックリリースで変更する提案があります。

メソッドをスーパークラスに移動することはできますが、サブクラスでメソッドに注釈を付けることができるように、サブクラスのメソッドを簡単にオーバーライドする必要があります。

于 2012-09-11T12:46:52.430 に答える