3

in(Scopes.SINGLETON)Guice には 2 つのシングルトン オブジェクト ( で宣言) があり、それぞれがコンストラクターで他方を使用します。これを実装する Guice の方法は、プロキシを使用することです。まず、他のオブジェクトへのプロキシを使用してオブジェクトを初期化し、そのオブジェクトが必要な場合にのみ解決されます。

このコードを複数のスレッドから実行すると、次の例外が発生します。

java.lang.IllegalStateException: This is a proxy used to support
circular references involving constructors. The object we're proxying is not
constructed yet. Please wait until after injection has completed to use this
object.
    at
com.google.inject.internal.ConstructionContext$DelegatingInvocationHandler.invoke(ConstructionContext.java:100)

これは Guice のバグだと思います。私たちは何も特別なことをしていないからです。私たちが見つけた回避策の 1 つは、 を使用してシングルトンを早期に初期化することです.asEagerSingleton()が、これはテストなどにはあまり便利ではありません。

これは既知の問題ですか? Google Guiceの問題を報告し、スタンドアロン テストで再現します。

他の提案/回避策はありますか?

4

1 に答える 1

6

Provider<T>実際のインスタンスではなく、各コンストラクターにa を注入しようとしましたか?

コンストラクターのコードで他のインスタンスが必要ない場合は、Providerを final フィールドに格納し、後でこのフィールドを使用します (を呼び出してget())。

于 2010-10-07T10:24:22.107 に答える