我正在尝试在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代码
谢谢
答案 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将生成捆绑包,正确显示。