繁体   English   中英

在抽象类中提供DI方法

[英]Providing DI methods in abstract classes

在大多数情况下,我有很多组件具有由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()移到抽象类。 但是在OSGi中与Bnd注释相关的情况如何。 只是用@Component注释类是行不通的,因为AD将创建抽象类的不同实例,而@Component也将创建实例。

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

DS批注必须在要为该组件实例化的类上。 不支持超类的注释。 有建议在将来的规范版本中进行更改。

您可以做的是将方法移到超类,但是您将需要在子类中平凡地重写该方法,以便可以在子类中对其进行注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM