通常我这样定义记录器:
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
但是在使用@Inject
时我们必须使用非静态和非final字段,比如:
@Inject
private Logger logger;
即记录器将在此类的每个实例中创建,记录器也是可变的。可能存在某种使记录器静态的方法?还有我如何将记录器绑定(bind)到某个类(我在从工厂 LoggerFactory.getLogger(MyClass.class);
创建记录器对象时使用发送类对象,如何使用注入(inject)以相同的方式创建记录器?) ?
最佳答案
请检查Custom Injections在 Guice wiki 上,有一个完整的 Log4J 示例。
编辑:您可以为记录器使用 static
字段或 final
字段,但不能使用 static final
字段。这是一个 Java limitation .
也要小心that :
Injecting final fields is not recommended because the injected value may not be visible to other threads.
还没有测试过,但是文章中的代码应该适用于静态字段,尽管您可以通过摆脱 MembersInjector 并在 TypeListener 中完成所有操作来改进它(因为静态字段只需要设置一次).
使用 requestStaticInjection()
将强制您在模块文件中列出所有类 - 这不是一个好主意,因为您很快就会忘记添加一个。
OTOH 如果你只想支持 JUL,你最好使用 built-in support (正如 Jeff 所提到的,我假设您不想要一个笼统的答案,因为您没有在您的问题中具体提到 JUL)。
关于java - 如何使用 Google Guice 注入(inject)记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14953541/