在为依赖注入设计应用程序时,通常最佳实践是尽可能避免使用静态字段和方法。这样可以使您的依赖关系更加清晰,并且在测试期间和随着应用程序的发展,更容易用其他实例替换您的真实依赖关系。因此,理想的行为是尽可能避免使用静态方法和字段(包括记录器)。
然而,Guice 确实允许将字段标记为静态,并在创建 Injector 时请求注入静态字段。这些字段需要保持可变——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();
}
}
}