これは別の質問の複製ですが、他の質問からコピーしています:
Felix SCR で次のメッセージが表示される問題に遭遇しました。
ServiceFactory.getService() で循環が発生しました
これが発生する理由は、アクティブ化メソッド内でそれを ServiceAImpl (ServiceA を提供する) と呼び、サービスが別のサービスを登録し、それを ServiceB と呼ぶためです。
ServiceA と ServiceB の両方に依存する ServiceCImpl という別のサービス コンポーネントがあります。ServiceAImpl が ServiceB を登録することで、ServiceCImpl が成立し、ServiceAImpl を起動する同じ呼び出し内で、ServiceCImpl バインド メソッドが呼び出されます。ServiceA のバインディング メソッドが呼び出されると、サイクルが検出され、コンポーネントの初期化に失敗します。
SCR が ServiceCImpl をバインドするのを待機できるようにする方法があるのかもしれませんし、ServiceB を別の方法で登録する必要があるのかもしれません。
Felix SCR が ServiceAImpl のアクティベーション メソッド内で ServiceCImpl をアクティベートする理由が理解できないと思います。アクティベーション メソッドが終了するまで ServiceCImpl が満足しているとは考えられません。おそらくこれは、サービスをフレームワークに直接登録しながら宣言型サービスを使用することの問題でしょうか?
Equinox のバージョンのような他の SCR 実装を試したことはありませんが、違いがあるかどうかを確認するために試してみるかもしれませんが、これが OSGi のものなのか Felix のものなのか誰かが知っているでしょうか?
追加情報: ServiceB がサービス コンポーネントではない理由については、ServiceA には実際には別のサービスに対する 0..n のサービス参照があり、それを ServiceD と呼びます。コンポーネントによって ServiceD インターフェイスが提供されるたびに、同じサービス オブジェクトを使用して ServiceB が登録されます。通常、ServiceD の同じプロバイダーが ServiceB を提供できますが、開発者が複数のサービス インターフェイスを提供する必要がないように、全体的なインターフェイスをより単純化することが目的です (また、ServiceB には、自動的に設定される必要があるいくつかのプロパティがあります)。手動で行われ、間違って行われる可能性があります)。