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