问题描述
我重构了现有的Osgi API。有一个用'final'关键字声明的实例变量(emailHandler),该变量在构造函数内部初始化。实例的实例化需要Osgi服务,但是我认为在osgi服务绑定发生之前就调用了构造函数,但是我所需的Osgi服务已经被其他捆绑软件注册了。有没有办法获得此Osgi服务?
这是我的示例代码。
head(df3)
#> x y z w pay ynm
#> 1 1 12 1 no 0
#> 2 2 17 1 no 0
#> 3 3 21 3 no 0
#> 4 4 9 1 no 0
#> 5 5 7 1 no 0
#> 6 6 1 2 no 0
我需要获取“ IEmailService” Osgi服务才能初始化“ emailHandler”。
还是在激活“ SampleOsgiService”后在构造函数之外实例化“ final”关键字并实例化“ emailHandler”和“ databaseStorage”?
解决方法
如果要使用final
,则可以使用构造函数注入。
@Component
public class Foo {
final Bar bar;
public Foo( @Reference Bar bar ) {
this.bar = bar;
}
}
无论如何,bind方法仅应在极少数情况下使用。改用字段引用:
@Reference
Bar bar;
最近几年OSGi发生了很多事!