通过 org.osgi.service.component 注解抽象组件

Posted

技术标签:

【中文标题】通过 org.osgi.service.component 注解抽象组件【英文标题】:Abstract components via org.osgi.service.component annotations 【发布时间】:2017-05-07 21:31:59 【问题描述】:

我正在从 org.apache.felix.scr 注释迁移到 org.osgi.service.component 注释。我有一组从通用抽象类继承的组件。在 felix 案例中,我可以在超类上使用带有选项 componentAbstract=true@Component 注释,然后在超类中使用 @Reference 注释。我找不到如何将其迁移到 osgi 注释。

是否可以在组件的超类中使用组件注解?如果是这样,那么处理属性和元类型生成的适当方法是什么?

所以,我要找的是这样的东西

/* No component definition should be generated for the parent, as it is
   abstract and cannot be instantiated */
@Component(property="parent.property=parentValue")
public abstract class Parent 
  @Reference
  protected Service aService;

  protected activate(Map<String,Object> props) 
    System.out.println("I have my parent property: "+props.get("parent.property"));

  @Override
  public abstract void doSomething();


/* For this class, the proper Component definition should be generated, also
   including the information coming from the annotations in the parent */
@Component(property="child.property=childValue")
public class Child extends Parent 

  @Activate
  public activate(Map<String,Object> props) 
    super.activate(props);
    System.out.println("I have my child property: "+props.get("child.property"));
  

  public void doSomething() 
    aService.doSomething();
  

【问题讨论】:

【参考方案1】:

默认情况下,BND 不会处理父类中的 DS 注释。您可以使用 -dsannotations-options: inherit 更改它,但请参阅 http://enroute.osgi.org/faq/ds-inheritance.html 为什么不应该这样做!


2021-02-23 更新:上面提到的页面似乎不再可用。我不知道它是被移到别处还是被简单地删除了,但它的内容(以 Markdown 格式)仍然可以在 GitHub 上找到:https://github.com/osgi/osgi.enroute.site/blob/pre-R7/_faq/ds-inheritance.md

【讨论】:

感谢您的链接。解释很清楚,但实际上侧重于不同捆绑中的父母。在我的例子中,这两个类都是同一个包的一部分,所以这些论点并不真正成立。 但是,我会将抽象类重写为工厂组件,并制作适配器来完成子类的所有专门实现。 借助 Maven Bundle 插件,您可以使用以下配置:&lt;configuration&gt; &lt;instructions&gt; &lt;_dsannotations-options&gt;inherit&lt;/_dsannotations-options&gt; &lt;/instructions&gt; &lt;/configuration&gt; @Galigator 我不知道为什么该页面不再可用。我用源链接更新了我的答案。

以上是关于通过 org.osgi.service.component 注解抽象组件的主要内容,如果未能解决你的问题,请参考以下文章

下拉框多选框单选框 通过TagHelper绑定数据

酶:测试孩子通过安装渲染失败,但通过浅时通过

java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解

通过代码进行 Spring 配置与通过注释进行配置

如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?

通过邮递员通过 API 使用 Rails 主动存储上传文件(.pdf、.jpg 等)? (不通过 Rails 视图)