【问题标题】:Providing DI methods in abstract classes在抽象类中提供 DI 方法
【发布时间】:2012-09-04 01:47:56
【问题描述】:

在大多数情况下,我有很多组件具有相同的类,由 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 的setter 和executeSomethingDependendOnServiceC() 方法移动到一个抽象类。但是它在与 Bnd 注释相关的 OSGi 中看起来如何。仅仅用@Component 注释类是行不通的,因为AD 会创建抽象类的不同实例,而@Component 也在创建一个实例。

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

【问题讨论】:

    标签: java osgi bnd


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,BJH。感谢您的回答。我已经考虑过了,但是我在 Apache Felix 网站上的 SCR 注释上发现Component 注释有一个标志componentAbstract。请参阅:felix.apache.org/site/… -> 抽象服务描述。但是没有关于此的其他信息,即使在 OSGi 规范中也是如此。你知道吗?
    • 我知道 Felix DS 的人是提议支持 DS 注释“继承”的人。 Felix 链接上的注释是 Felix 专有的注释。
    • AFAIU,使用 maven-scr-plugin 的 Felix 注解将在构建时简单地将抽象超类的注解与继承的注解合并。此外,OSGi 规范没有标准化,因为将这样的抽象组件放入您的 API(导出的包)是一个坏主意,因为您将暴露太多的实现细节并在您更改 @References 等时强制重建所有继承组件。在抽象基类中。
    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 2015-03-10
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多