Java 什么';apache.felix.dm包中init()和start()方法的区别是什么?

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框架上注册之

我现在正在研究Opendaylight项目(一个由Cisco领导的开源SDN控制器项目),发现该项目使用apache.felix.dm包中的资源在运行时动态管理equinox(一个OSGi框架)上的服务依赖关系

为了理解dm的机制,我在apache.felix.dm包下跟踪了ComponentImpl.java中的代码。我现在的理解是:

  • DependencyManager将在满足所有服务依赖项后调用init()方法
  • start()方法将在init()方法之后但在类提供的服务在OSGi框架上注册之前调用
  • 以代码编写的调用机制如下所示(它们都位于componentmpl.java中):

    调用init()的方法:

    要调用start()的方法:

    现在我的问题是:init()和start()方法之间有什么区别?既然它们都是在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));
      }
    }