【问题标题】:How to inject SLF4J bindings with Guice?如何用 Guice 注入 SLF4J 绑定?
【发布时间】:2012-10-16 07:13:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你到底想做什么?您是否尝试使用 Guice 注入 Logger?注入LoggerFactory?将LoggerFactory 绑定到基于 Guice 配置的特定 API 实现? (我之前没有使用过 SLF4J,但据我所知,这三个都是可行的。)

标签: java spring dependency-injection guice slf4j


【解决方案1】:

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

SLF4j 具有可替换实现的基本思想是让 binder lib 提供org.slf4j.impl.StaticLoggerBinder 和 SLF4J API 将通过类加载器查找此类。因此,如果类路径中有超过 1 个绑定器,则无法区分它们提供的 org.slf4j.impl.StaticLoggerBinders。考虑到 Logging 框架甚至在 DI 发生之前就已初始化,因此 DI 框架不会对此提供帮助。

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

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

【讨论】:

    【解决方案2】:

    解决此问题的一个相当简单的方法是通过setILoggerFactory() 方法将ILoggerFactory 实例注入LoggerFactory。 (截至 2012 年 10 月,setILoggerFactory() 方法不存在。)

    SLF4J 目前实现的静态绑定机制除了设置ILoggerFactory 之外并没有做太多的事情。这种方法对你有用吗?

    【讨论】:

      【解决方案3】:

      对于现在发现此问题的任何人:Sangria 实现了一个“上下文敏感的绑定器”,对此非常有效;具体见sangria-slf4jsangria-contextual

      the author's blog post,您可以像这样简单地设置一个名为 SLF4J 的记录器工厂:

      public class YourModule extends AbstractModule {
          @Override
          protected void configure() {
              install(new SangriaSlf4jModule());
          }
      }
      

      ...还有一些示例说明如何将新提供程序用于您自己的类型。

      【讨论】:

      • OP 不要求根据上下文注入带有名称的 Logger。他要求甚至切换 SLF4j 的实现(也称为绑定)。
      • 很好的发现。感谢您发布此信息!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2016-07-26
      相关资源
      最近更新 更多