27

Google Guice には、優れた依存性注入機能がいくつか用意されています。

最近@Nullable機能に出くわしました。これにより、Guice はデフォルトでこれらを許可しないため、コンストラクター引数をオプション (null を許可) としてマークできます。

例えば

public Person(String firstName, String lastName, @Nullable Phone phone) {
    this.firstName = checkNotNull(firstName, "firstName");
    this.lastName = checkNotNull(lastName, "lastName");
    this.phone = phone;
}

https://github.com/google/guice/wiki/UseNullable

人々が使用する Guice のその他の便利な機能 (特にあまり目立たない機能) は何ですか?

4

3 に答える 3

39

これらはどれも非表示にすることを意図したものではありませんが、Guice の私のお気に入りの「ボーナス機能」は次のとおりです。

  • Guice はTypeLiteral<T> を注入して、効果的に消去を無効にすることができます。
  • TypeLiteralはジェネリック型解決を行うことができます。これはget()、 aが をList<String>返すことを示していますIterator<String>
  • は、Java のジェネリック型インターフェイスの実装のファクトリです。
  • Grapher はインジェクターを視覚化します。カスタム プロバイダーがHasDependenciesを実装している場合、このグラフを拡張できます。
  • Modules.override()は、ピンチで非常に便利です。
  • パラメータ化されたキーを定義するための短い構文: new Key<List<String>>() {}.
  • Binder.skipSources()を使用すると、エラー メッセージが適切に行番号を追跡する拡張機能を作成できます。
  • SPIElements.getElements()はモジュールをアトムに分割し、Elements.getModule()はそれらを元に戻します。
  • と を に実装するequals()hashCode()Moduleそのモジュールを何度でも問題なくインストールできます。
于 2010-04-27T04:47:59.803 に答える
13

インターフェイスが完全にオープンであることが気に入っています。基本的には、 からへScopeの単なる変換です。(さて、からとへ)ProviderProviderKeyProviderProvider

基本的にシングルトンにしたいものもありますが、30分ごとにデータベースから再読み込みしますか? そのためのスコープを作成するのは簡単です。いくつかのリクエストをバックグラウンドで実行し、「すべてのバックグラウンド リクエストが同じ HTTP リクエストから開始された」ことを意味するスコープを持ちたいですか? それも比較的簡単に書けScopeます。

Keyクライアントから実行しているテストごとに個別のインスタンスを使用するように、テスト中にサーバー上でいくつかのスコープを設定したいですか? (テストが Cookie または追加の HTTP パラメータでテスト ID を渡す場合) それを行うのは難しいですが、それは完全に可能であり、誰かが既にあなたのためにそれを書いています

はい、過度に乱用Scopeすると、ジェシーは杭やニンニクのクローブを探し始めますが、その驚くべき柔軟性は非常に役立ちます.

于 2010-04-27T15:59:11.990 に答える
12

ModuleGuice の優れた機能の 1 つは、以下を使用してメソッド インターセプターを簡単に実装できることです。

public void bindInterceptor(
    Matcher<? super Class<?>> classMatcher,
    Matcher<? super Method> methodMatcher,
    MethodInterceptor... interceptors);

これで、そのスコープmethodMatcher内で一致するクラス内で一致するメソッドはすべて、によってインターセプトされます。classMatcherModuleinterceptors

例えば:

bindInterceptor(
    Matchers.any(),
    Matchers.annotatedWith(Retryable.class),
    new RetryableInterceptor());

これで、任意のメソッドにアノテーションを付けるだけで@RetryableRetryableInterceptor失敗した場合に再試行できます。

于 2010-06-24T05:14:24.833 に答える