OSGi是否保证在调用Activate方法之前已经激活了引用字段?

时间:2014-10-02 17:11:12

标签: java service initialization osgi apache-felix

考虑以下课程:

@Service(MyTest.class)
public class MyTest{
     @Reference
     ExternalService externalService;

     @Activate
     public void activate(){
        externalService.someMethod();
     } 
}

OSGi是否保证在externalService类的activate()方法中调用之前MyTest已经激活?

2 个答案:

答案 0 :(得分:0)

ExternalService不是组件,而是OSGi服务。 OSGi服务可能已由另一个组件注册。

如果服务是由其他组件自动注册的(在您的示例中使用@Service注释),则必须在注册服务之前调用其他组件的activate方法。但是,如果在您的activate方法中使用断点,则可能会在Web控制台上看到未满足状态的其他组件。原因是 MyTest 的activate方法被同步调用,而另一个组件的状态标志尚未被DS更改。简而言之,即使您看到其他组件的状态未被满足,也会在调用组件的Activate方法时完成组件的Activate方法。

如果从另一个组件的Activate方法以编程方式注册该服务,则可能会同步调用您的activate方法。在这种情况下,如果在注册服务后其他组件的activate方法中有更多逻辑,则它尚未初始化。

OSGi服务也可能是由其他技术注册的,也可能是从另一个包的Activator手动注册的。

答案 1 :(得分:0)

有助于查看从注释生成的组件XML。 Service注释不是OSGi声明服务标准注释。

但通常,必须在调用activate方法之前设置所有非可选的policy="static"引用。可以取消设置可选参考。