2011-06-24 9 views
2

私はGuice-injectedオブジェクトを2つのライフサイクルメソッドbind()unbind()を持っています。オブジェクトはGuiceのでインスタンス化された後、方法bind()は、アノテーション付きメソッド次を使用して自動的に呼び出されます:Guiceでオブジェクトのライフサイクルを制御する方法

@Inject 
final void autoBind() { 
    bind(); 
} 

私は何をしたいことは、オブジェクトの新しいインスタンスを前に、古い(現在の)オブジェクトのメソッドunbind()を呼び出すことですGuiceによって作成されます。それ、どうやったら出来るの?

ありがとうございます!

答えて

2

ファーストを参照することができますので、このような何かをしたいと思う理由は本当にわからないけれども

、私はあなただけ@で任意のメソッドに注釈を付けることをお勧めしません注射する。コンストラクタに保管してください。場合によっては、オプションの注入および/またはフィールド注入を行います。

あなたがしようとしているのはちょっと変わった音ですが、私はそれがまさにあなたが望むものではないかと思います。おそらく別のアプローチが良いかもしれないので、あなたがやろうとしていることについてより多くの背景を提供してください。間違いなく、スレッドの安全性と参照の管理方法について懸念があります。

あなたが説明した内容に基づいて、おそらく@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を紹介:ただの質問に答えるになるよう

+0

お返事ありがとうございます。私はすでにこのソリューションを試してみましたが、私はそれが必要だと思っていますが、問題はコンストラクタに注入された 'プロバイダ'です。これは無限ループを引き起こします。これはGuiceが 'Foo'の' Provider'を探し、 'FooProvider'を見つけて、そのコンストラクタに' Provider 'を再帰的に注入しようとするからです。あなたがこの問題を克服する方法を知っているなら、私に教えてください!それ以外の場合は、私が必要とするものを行うでしょう。ありがとう! – janhink

+0

@eQui - 内部プロバイダのためにバインディングアノテーションを使用しましたか? Guiceに関する限り、「Foo」と「@Unbound Foo」は全く異なる2つのタイプです。 'com.google.inject.Key'クラスを見てください。 Guiceがタイプを区別するために内部で使用するタイプです。タイプ情報(クラスのようなもの)+バインディングアノテーション情報(@Unboundのようなもの)であることに注目してください。 '@Unbound Foo'が' Foo'に直接的または間接的に依存していない限り、循環依存性はありません。 – Tom

+0

これでも問題が解決しない場合は、コメント内でさらに質問をしてください(あるいは質問に更新を加えて) – Tom

0

私はあなたが現在のオブジェクトへの参照を保持するプロバイダを持つことができたと思います。プロバイダでgetを呼び出すと、最後のオブジェクトのバインドが解除され、新しいオブジェクトが作成され、そのオブジェクトへの参照が保存されます。私はあなたが他のオブジェクトが理論的にはまだそれをすべての

1

前の応答は、うまく他の懸念に対処します。注釈(@PreConfiguration@PostConstruct@PreDestroyなど)、クラスパススキャン&自動バインディング、およびその他の機能を提供します。 Bootstrappingは簡単です。

関連する問題