使用Reference批注或bundleContext获取注册的osgi服务

问题描述

我重构了现有的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发生了很多事!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...