9

通常、私はロガーを次のように定義します。

private static final Logger logger = LoggerFactory.getLogger(MyClass.class); 

ただし、使用する場合@Injectは、次のような非静的および非最終フィールドを使用する必要があります。

@Inject
private Logger logger;

つまり、ロガーはこのクラスの各インスタンスで作成され、ロガーも変更可能です。ロガーを静的にする方法が存在する可能性がありますか?また、ロガーを特定のクラスにバインドする方法(ファクトリからロガーオブジェクトを作成するときにクラスオブジェクトの送信を使用LoggerFactory.getLogger(MyClass.class);します。インジェクションを使用して同じ方法でロガーを作成する方法は?)?

4

2 に答える 2

7

Guicewikiのカスタムインジェクションを確認してください。完全なLog4Jの例があります。

編集:ロガーにはstaticフィールドまたはフィールドのいずれかを使用できますが、使用することはできません。これはJavaの制限です。finalstatic final

また、次の点にも注意しください。

挿入された値が他のスレッドに表示されない可能性があるため、finalフィールドを挿入することはお勧めしません。

それをテストしていませんが、MembersInjectorを削除し、TypeListenerですべてを実行することで改善できますが(静的フィールドは1回だけ設定する必要があるため)、記事のコードは静的フィールドで正常に機能するはずです。

を使用requestStaticInjection()すると、すべてのクラスをモジュールファイルにリストする必要があります。すぐに追加するのを忘れてしまうため、お勧めできません。

OTOH JULをサポートしたいだけの場合は、組み込みのサポートを使用する方がよい場合があります(Jeffが述べたように、質問でJULについて具体的に言及しなかったため、一般的な回答は必要ないと思いました)。

于 2013-02-19T09:43:39.620 に答える
4

依存性注入用にアプリケーションを設計する場合、通常、ベスト プラクティスは静的フィールドとメソッドをできるだけ避けることです。これは、依存関係をより明確にするためであり、テスト中やアプリケーションの進化に合わせて、実際の依存関係を他のインスタンスに簡単に置き換えることができます。したがって、理想的な動作は、静的メソッドとフィールド (ロガーを含む) をできるだけ避けることです。

ただし、Guice では、フィールドを静的にマークし、インジェクターの作成時に静的フィールドの注入を要求することができます。フィールドは可変のままである必要があります。これfinalは、「Guice を除いて最終」という意味ではありません。

public class YourClass {
  @Inject static Logger logger;

  /* ... */
}

public class YourModule extends AbstractModule {
  @Override public void configure() {
    /* YourClass.logger will work once you create your Injector. */
    requestStaticInjection(YourClass.class);
  }
}

Guice は、クラス名が埋め込まれたjava.util.logger.Loggerインスタンスを自動的に提供しますが、これは、 Guice にコード化された特別なケースのためだけです。この SO questionのように、特別なロガーが必要な場合は、Jakub がリンクしたカスタム インジェクションを調査する必要があります。これも Guice の外部の静的ファクトリにリファクタリングします。

@LogToFile
public class YourClass {
  private static final Logger logger = YourLoggerFactory.create(YourClass.class);

  /* ... */
}

public class YourLoggerFactory {
  private YourLoggerFactory { /* do not instantiate */ }

  public Logger create(Class<?> clazz) {
    if (clazz.getAnnotation(LogToFile.class) != null) {
      return someImplementation(new File(...));
    } else {
      return someOtherImplementation();
    }
  }
}
于 2013-02-20T06:00:24.723 に答える