java - 如何使用 Guice 注入(inject) SLF4J 绑定(bind)?

标签 java spring dependency-injection guice slf4j

粗略检查后,似乎 SLF4J 和 Guice(好吧,任何 DI 框架,真的)是一种相互冲突的哲学。 SLF4J 采用“嘿,直到运行时我们才知道要绑定(bind)到哪些类,这没关系。”另一方面,Guice 似乎在说“嘿,我们需要在编译时确切地知道我们要绑定(bind)到哪些类。"。

所以我问:是否可以使用 Guice/Spring/任何 DI 框架来配置/注入(inject) SLF4J 绑定(bind)?

关键在于 Java ClassLoader 是真正在运行时使用适当的 Logger/LoggerFactory/等“注入(inject)”SLF4J 的东西。对象,所以我不知道如何注入(inject)这些 ClassLoader,以便它们在运行时返回我想要的 org.slf4j.impl.Logger:

我问是因为我喜欢 SLF4J 和针对 API 进行日志记录的好处,但也喜欢 DI 的好处。有没有办法使这项工作?提前致谢!

最佳答案

我相信这是不可能的(除非你做一些非常麻烦的事情,比如为你的应用程序创建子类加载器的容器......类似的东西)

SLF4j 具有可替换实现的基本思想是让 Binder 库提供 org.slf4j.impl.StaticLoggerBinder 并且 SLF4J API 将通过类加载器查找此类。因此,如果类路径中有超过 1 个 Binder ,则无法区分它们提供的 org.slf4j.impl.StaticLoggerBinder。鉴于日志框架甚至在 DI 发生之前就已初始化,DI 框架对此无济于事。

除非 SLF4J 将来改变其设计,否则我们无能为力。而且,我怀疑 SLF4J 是否有可能改变其设计。因为我们无法告诉 DI 容器日志初始化是每个人都依赖的东西。我相信还有更多的原因使它几乎不可能实现。

然而,我怀疑的是,这真的与 DI 有关吗?老实说,我没有看到通过将相应的 JAR 放在类路径中来控制使用哪个日志记录绑定(bind)的问题。如果您想在运行时以编程方式控制它,我认为编写一个小容器来启动您的应用程序是可行的方法。然而,它仍然与 DI 无关。

关于java - 如何使用 Guice 注入(inject) SLF4J 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13079843/

相关文章:

java - Spring Activiti 网关

android - 如何将 Dagger 2 与自定义 View 一起使用?

java - ZipFile 中的 ZipFile

java - 如何摆脱 "HHH90000003: Use of DOM4J entity-mode is considered deprecated"

spring - Spring MVC 中的依赖注入(inject)问题 [版本 Spring 3.1.0.RELEASE]

unit-testing - MassTransit 服务总线配置和单元测试

asp.net-mvc - Ninject依赖注入(inject): Read bindings from config?

java - 如何将两个一维数组相乘?

java - 将大文件(> 2GB)上传到 websphere

Java:HttpComponents 从特定 URL 的输入流获取垃圾响应