ファーストを参照することができますので、このような何かをしたいと思う理由は本当にわからないけれども
、私はあなただけ@で任意のメソッドに注釈を付けることをお勧めしません注射する。コンストラクタに保管してください。場合によっては、オプションの注入および/またはフィールド注入を行います。
あなたがしようとしているのはちょっと変わった音ですが、私はそれがまさにあなたが望むものではないかと思います。おそらく別のアプローチが良いかもしれないので、あなたがやろうとしていることについてより多くの背景を提供してください。間違いなく、スレッドの安全性と参照の管理方法について懸念があります。
あなたが説明した内容に基づいて、おそらく@meverettのようなアプローチが有効です。あなたが持っているオブジェクトがFoo
であれば、このようになります。あなたの@Unbound Foo
プロバイダが特別なメソッドを呼び出さずFoo
Sを生成する
// Later on be sure to bind(Foo.class).toProvider(FooProvider.class);
final class FooProvider implements Provider<Foo> {
private final Provider<Foo> unboundFooProvider;
private Foo currentInstance;
@Inject FooProvider(@Unbound Provider<Foo> unboundFooProvider) {
this.unboundFooProvider = unboundFooProvider;
}
@Override public Foo get() {
if (currentInstance != null) {
currentInstance.unbind();
}
currentInstance = unboundFooProvider.get();
currentInstance.bind();
return currentInstance;
}
}
NOTE。通常のFooProvider
は、状態を追跡して、bind()
とunbind()
のインスタンスをいつ決定するかを決定します。複数のインスタンスをどのように管理し、複数のスレッドでそれらを使用するかに注意してください。
さらに、私は@Unbound
を使用しています。呼び出したいメソッドはbind()
とunbind()
です。私はGuiceの意味で「束縛」を使っていません。
また、私の頭の上から外されています。私はかなり確信しています。プロバイダーはシングルトンとして扱われるので、このような状態を維持することができます。もしそうでなければ、明らかに何らかのシングルトンファクトリを使って間接レベルを作成することができます(しかし、それは必要ではありません)。
ネットフリックスは、「enhance Google Guice to provide ... lifecycle management」に2012年にgovernator in githubを紹介:ただの質問に答えるになるよう
出典
2011-06-26 05:15:36
Tom
お返事ありがとうございます。私はすでにこのソリューションを試してみましたが、私はそれが必要だと思っていますが、問題はコンストラクタに注入された 'プロバイダ'です。これは無限ループを引き起こします。これはGuiceが 'Foo'の' Provider'を探し、 'FooProvider'を見つけて、そのコンストラクタに' Provider 'を再帰的に注入しようとするからです。あなたがこの問題を克服する方法を知っているなら、私に教えてください!それ以外の場合は、私が必要とするものを行うでしょう。ありがとう! –
janhink
@eQui - 内部プロバイダのためにバインディングアノテーションを使用しましたか? Guiceに関する限り、「Foo」と「@Unbound Foo」は全く異なる2つのタイプです。 'com.google.inject.Key'クラスを見てください。 Guiceがタイプを区別するために内部で使用するタイプです。タイプ情報(クラスのようなもの)+バインディングアノテーション情報(@Unboundのようなもの)であることに注目してください。 '@Unbound Foo'が' Foo'に直接的または間接的に依存していない限り、循環依存性はありません。 –
Tom
これでも問題が解決しない場合は、コメント内でさらに質問をしてください(あるいは質問に更新を加えて) – Tom