3

2つのバインディングに続くスコープにはどのようなものがあるのでしょうか。

bind(PermissionManager.class).in(Singleton.class);

bind(PermissionManager.class);

JavaDocsを読みましたが、次のとおりです。シングルトンの場合:

/**
* Apply this to implementation classes when you want only one instance
* (per {@link Injector}) to be reused for all injections for that binding.
*
* @author crazybob@google.com (Bob Lee)
*/

スコープなし:

/**
* No scope; the same as not applying any scope at all.  Each time the
* Injector obtains an instance of an object with "no scope", it injects this
* instance then immediately forgets it.  When the next request for the same
* binding arrives it will need to obtain the instance over again.
*
* <p>This exists only in case a class has been annotated with a scope
* annotation such as {@link Singleton @Singleton}, and you need to override
* this to "no scope" in your binding.
*
* @since 2.0
*/

これは実際にはどういう意味ですか?シングルトンはクライアントごとですか、それともJVMごとですか?スコープがない場合、すべてのインスタンスは異なりますか?

4

2 に答える 2

3

Gin の実際的な観点から言えば、Singleton スコープは、クライアント インスタンスごと、またはより正確には Ginjector インスタンスごとに考えると最も理にかなっています。インスタンスを 2 回実行して 2 つの Ginjector を作成するというミスを犯しGWT.createた場合、各 Ginjector はそれが管理するインスタンスしか追跡できないため、インスタンスごとに 1 つの「シングルトン」が作成される可能性があります。

したがって、アプリケーションがロードされるたびに、独自のシングルトンが作成されます。ユーザーが 2 つの異なるタブで同じアプリケーションを 2 回開くと、それぞれに独自のシングルトンが作成されます。すべてのクラスの独自のコピーがあり、他のウィンドウで通信したりメソッドを呼び出したりできないため、各タブを独自の JVM と見なすことができます。

スコープがない場合、はい、デフォルトでは各インスタンスが異なります。タイプが@Inject編集されると、そこに新しいインスタンスが作成されますが、フィールドの場合は@InjectProvider呼び出すたびget()に新しいインスタンスを取得できます。これは、新しく注入されたいくつかのインスタンスを簡単に取得するのに役立ちます。

シングルトンは主に 2 つのケースで使用するのが理にかなっています

  • インスタンスが、多くのインジェクションで共通である必要がある共有状態を保持している場合 - 最も一般的なケースです。
  • インスタンスの作成に費用がかかる場合 - サーバー上では、これはプールとして行われることが多いため、作成されるオブジェクトは X 個までですが、クライアント上の費用のかかるオブジェクトは、多くのウィジェットを持ち、通常は複数のビューになる傾向があります。必須ではありません。

* 別のウィンドウでメソッドを呼び出すことは可能ですが、オブジェクトをやり取りするだけでなく、メッセージを投稿することによって、ブラウザーの機能を使用する必要があります。

于 2012-02-25T21:55:17.337 に答える
2

シングルトンは、作成した最上位のGinjectorによって1回だけ作成されます(ほとんどのアプリケーションでは、Ginjectorを1つだけ作成します)。

スコープ外のオブジェクトは、依存関係として別のオブジェクトに挿入されるたびに作成されます。したがって、すべてのインスタンスは異なります。スコープを設定しない場合(またはバインダーDSLがバインディングに対して実行できるその他のことを実行する場合)は、実際にはbind(SomeClass.class)を記述する必要はありません。デフォルトのコンストラクターを使用するか、@ Injectをコンストラクターに追加するだけで、Ginがそれを作成できるようになります。

一般に、GuiceまたはGinを使用している場合は、正当な理由がない限り、スコープを外したままにしておきます。スコープに関するGuiceのドキュメントを読むことをお勧めします。

于 2012-02-24T21:46:52.893 に答える