私は現在、Opendaylight プロジェクト (Cisco が主導するオープンソース SDN コントローラー プロジェクト) について調査しており、このプロジェクトが apache.felix.dm パッケージのリソースを使用して、実行時に equinox (OSGi フレームワーク) のサービス依存関係を動的に管理していることを発見しました。 .
dm のメカニズムを理解するために、apache.felix.dm パッケージの下にある ComponentImpl.java のコードをトレースしました。私が今理解していることは次のとおりです。
- DependencyManager は、すべてのサービスの依存関係が満たされた後に init() メソッドを呼び出します。
- start() メソッドは init() メソッドの後、ただしクラスによって提供されるサービスが OSGi フレームワークに登録される前に呼び出されます。
コードで記述された呼び出しメカニズムは次のように提供されます (どちらも ComponentImpl.java にあります)。
init() を呼び出すメソッド:
private void activateService(State state) {
String init;
synchronized (this) {
init = m_callbackInit;
}
// service activation logic, first we initialize the service instance itself
// meaning it is created if necessary and the bundle context is set
initService();
// now is the time to configure the service, meaning all required
// dependencies will be set and any callbacks called
configureService(state);
// flag that our instance has been created
m_isInstantiated = true;
// then we invoke the init callback so the service can further initialize
// itself
invoke(init);
// see if any of this caused further state changes
calculateStateChanges();
}
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();
}
今私の質問は: init() と start() メソッドの違いは何ですか? サービスが OSGi フレームワークに登録される前に両方とも呼び出されるため、なぜそれらを分離する必要があるのでしょうか? 私の理解が間違っている場合は教えてください。
よろしくお願いします、
ジェイ