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
   }      
}

我想将 setterServiceC和方法移动executeSomethingDependendOnServiceC()到抽象类。但是它在 OSGi 中与 Bnd 注释的关系如何。只是用@Component 注释类是行不通的,因为A并且D会创建抽象类的不同实例,而@Component 也正在创建一个实例。

也许有人遇到同样的问题,并给我一些建议,解决方法可能是什么样子。至少一个最佳实践解决方案也可以:)

4

1 回答 1

5

DS 注释必须在为组件实例化的类上。不支持对超类的注释。有一个建议在未来的规范版本中更改。

您可以做的是将方法移动到超类,但您需要在子类中简单地覆盖该方法,以便您可以在子类中对其进行注释。

于 2012-09-11T12:46:52.430 回答