经过粗略的检查,SLF4J 和 Guice(好吧,任何 DI 框架,真的)似乎是一种相互矛盾的哲学。 SLF4J 采用的方法是“嘿,直到运行时我们才知道我们将绑定(bind)到哪些类,这没关系。”另一方面,Guice 似乎在说“嘿,我们需要在编译时确切地知道我们绑定(bind)到哪些类。”。
所以我问:是否可以使用 Guice/Spring/任何 DI 框架来配置/注入(inject) SLF4J 绑定(bind)?
关键是 Java ClassLoader
是在运行时使用适当的 Logger/LoggerFactory/etc 真正“注入(inject)”SLF4J 的东西。对象,所以我不知道如何注入(inject)这些类加载器,以便它们在运行时返回我想要的 org.slf4j.impl.Logger
:
我问是因为我喜欢 SLF4J 的好处和针对 API 的日志记录,但也喜欢 DI 的好处。有没有办法使这项工作?提前致谢!
最佳答案
我相信这是不可能的(除非你做了一些非常麻烦的事情,比如为你的应用程序创建子类加载器的容器......类似的东西)
SLF4j 具有可替换实现的基本思想是让绑定(bind)库提供 org.slf4j.impl.StaticLoggerBinder
,SLF4J API 将通过类加载器查找此类。因此,如果类路径中有 1 个以上的 binder,则无法区分它们提供的 org.slf4j.impl.StaticLoggerBinder
。鉴于日志框架甚至在 DI 发生之前就已初始化,DI 框架对此无济于事。
除非SLF4J在 future 改变其设计,否则我们无能为力。而且,我怀疑即使 SLF4J 改变其设计也是可能的。因为我们无法告诉 DI 容器 Logging 初始化是每个人都依赖的东西。我相信还有更多的原因使它几乎不可能实现。
但是,我怀疑的是,这真的与DI有关吗?老实说,我没有看到通过将相应的 JAR 放在类路径中来控制使用哪个日志绑定(bind)的问题。如果您想在运行时以编程方式控制它,我认为编写一个小容器来启动您的应用程序是可行的方法。但是,它仍然与DI无关。
关于java - 如何使用 Guice 注入(inject) SLF4J 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13079843/