如何使用Google Guice注入记录器

MyT*_*tle 7 java logging guice

通常我会像这样定义记录器:

private static final Logger logger = LoggerFactory.getLogger(MyClass.class); 
Run Code Online (Sandbox Code Playgroud)

但在使用时@Inject我们必须使用非静态和非最终字段,如:

@Inject
private Logger logger;
Run Code Online (Sandbox Code Playgroud)

即,将在此类的每个实例中创建记录器,记录器也是可变的.可能存在一些让logger静态的方法吗?另外我如何将记录器绑定到某个类(我使用从工厂创建logger对象时发送类对象LoggerFactory.getLogger(MyClass.class);,如何使用注入以相同的方式创建记录器?)?

Jak*_*ski 7

请检查Guice wiki上的自定义注入,有一个完整的Log4J示例.

编辑:您可以使用static字段或final字段作为记录器,但不能使用static final.这是Java 限制.

另外要警惕的是:

建议不要注入最终字段,因为其他线程可能看不到注入的值.

没有测试过,但文章中的代码应该适用于静态字段,尽管你可以通过删除MembersInjector并在TypeListener中完成所有操作来改进它(因为静态字段只需要设置一次).

使用requestStaticInjection()将强制您在模块文件中列出所有类 - 这不是一个好主意,因为您很快就会忘记添加一个.

OTOH如果你只是想支持JUL,你可能更善于使用内置支持(如Jeff所述,我认为你不想得到一般答案,因为你没有在你的问题中特别提到JUL).