Java 什么';apache.felix.dm包中init()和start()方法的区别是什么?
我现在正在研究Opendaylight项目(一个由Cisco领导的开源SDN控制器项目),发现该项目使用apache.felix.dm包中的资源在运行时动态管理equinox(一个OSGi框架)上的服务依赖关系 为了理解dm的机制,我在apache.felix.dm包下跟踪了ComponentImpl.java中的代码。我现在的理解是:Java 什么';apache.felix.dm包中init()和start()方法的区别是什么?,java,osgi,apache-felix,Java,Osgi,Apache Felix,我现在正在研究Opendaylight项目(一个由Cisco领导的开源SDN控制器项目),发现该项目使用apache.felix.dm包中的资源在运行时动态管理equinox(一个OSGi框架)上的服务依赖关系 为了理解dm的机制,我在apache.felix.dm包下跟踪了ComponentImpl.java中的代码。我现在的理解是: DependencyManager将在满足所有服务依赖项后调用init()方法 start()方法将在init()方法之后但在类提供的服务在OSGi框架上注册之
Jay同时使用
init
和start
方法的原因如下。依赖关系管理器允许您在(Java)代码中以声明方式定义组件及其依赖关系。这可以在启动捆绑包时完成,但有时组件可能具有依赖于某个配置的依赖项,或其某个其他依赖项。换句话说,您可能需要在运行时将依赖项添加到组件中
在这种情况下,您可以在组件实现上定义init(组件c)
方法。该方法将在您的组件已初始化且其所有必需的依赖项已被注入(或其回调已被调用)后调用。因此,此时您可以访问组件中的此类依赖项,并且可以根据通过此类依赖项获得的信息,决定动态添加另一个组件,如下所示:
public volatile OtherService s; // an injected service dependency
public void init(Component c) {
if (s.needsSomeService()) {
DependencyManager dm = c.getDependencyManager();
c.add(dm.createServiceDependency()
.setService(SomeService.class)
.setInstanceBound(true)
.setRequired(true));
}
}
一旦SomeService
变得可用,就会调用start()
方法,并且您的组件变得可用(这意味着如果它发布了服务,现在就可以完成)
简而言之:init
方法允许您在运行时操作自己的组件定义并动态添加额外的依赖项。一旦所有依赖项都可用,就会调用start
方法
在简单的场景中,如果您没有这样的要求,那么使用任何一种方法进行初始化都可以。根据init将其加载到类中的概念,在进行调用时准备好,start使调用方调用我,您能详细解释一下您提到的“调用”吗?这有点像“回调”的功能吗?
private void bindService(State state) {
String start;
synchronized (this) {
start = m_callbackStart;
}
// configure service with extra-dependencies which might have been added from init() method.
configureServiceWithExtraDependencies(state);
// inform the state listeners we're starting
stateListenersStarting();
// invoke the start callback, since we're now ready to be used
invoke(start);
// start tracking optional services
startTrackingOptional(state);
// register the service in the framework's service registry
registerService();
// inform the state listeners we've started
stateListenersStarted();
}
public volatile OtherService s; // an injected service dependency
public void init(Component c) {
if (s.needsSomeService()) {
DependencyManager dm = c.getDependencyManager();
c.add(dm.createServiceDependency()
.setService(SomeService.class)
.setInstanceBound(true)
.setRequired(true));
}
}