在Scala中使用Apache felix SCR Annoration @Reference,用于OSGI环境

时间:2013-12-08 04:21:50

标签: scala dependency-injection annotations osgi apache-felix

我正在尝试在Scala中使用@Reference Felix SCR注释

这是它在Java中的使用方式:

public class Foo {

    @Reference
    MyServiceInterface service;
    // some code here
}

这里,MyService理想情况下是Java接口,而不是具体的类(依赖注入)

我在Scala中使用相同的注释,尝试依赖于相同的MyService(Java接口),如:

class Foo {
    @Reference
    val service = MyServiceInterface // ??
    // some code here
}

如何在Scala中使用此注释来引用Java接口?

示例:

@Reference
val MyServiceInterface service

@Reference
val service = MyServiceInterface

无效的Scala代码

谢谢

3 个答案:

答案 0 :(得分:1)

我对Scala知之甚少但我相信“val”意味着一个不可变的值,因此将它绑定到(可变的)服务引用是没有意义的。

不应该使用“def”或“var”声明此成员字段吗?在这种情况下,可能会允许注释。

答案 1 :(得分:0)

引用注释具有interfaceReference属性。 该属性可用于指定java接口。

我假设在scala中它看起来像(从未在scala中使用过Felix Annotation):

@Reference(interfaceReference = MyServiceInterface)
val MyServiceInterface service

在这种情况下,您可能还必须指定bind和unbind方法。 另请参阅Felix Annotations documentation

自1.9.0以来,Felix Annotation是运行时注释。 Annotation Felix Processor有一个选项scanClasses来使用类而不是源代码来处理注释。这与groovy完美搭配。我认为没有理由不应该使用Scala。

如果您使用Intellij,请查看Felix Annotation Plugin。该插件默认使用扫描类

答案 2 :(得分:0)

我能够通过正确指定变量的类型来解决这个问题,如:

@Reference
var service: MyServiceInterface = null

@Neil是对的,我们必须使用var而不是val,因为服务绑定在运行时发生。

其次,我必须将以下配置添加到maven-scr-plugin:

<configuration>
    <scanClasses>true</scanClasses>
</configuration>

然后,我必须特别指示Maven Bundle插件不要导入org.apache.felix.scr.annotations包,如下所示:

<Import-Package>!org.apache.felix.scr.annotations, *</Import-Package>

因为清单会包含此包的条目作为捆绑包依赖的内容。

完成此操作后,mvn-scr-plugin将正确生成XML文件,mvn-bundle-plugin将生成捆绑包,正确显示。