Ban*_*der 5 java spring dependency-injection guice slf4j
经过粗略的检查后,SLF4J 和 Guice(实际上是任何 DI 框架)似乎是一种相互冲突的理念。SLF4J 采用的方法是“嘿,我们要到运行时才知道要绑定到哪些类,那没关系。 ” 另一方面,Guice 似乎在说“嘿,我们需要在编译时知道”确切地说,我们要绑定到哪些类。 ”
所以我问:是否可以使用 Guice/Spring/任何 DI 框架来配置/注入 SLF4J 绑定?
更重要的是,JavaClassLoader才是真正在运行时使用适当的 Logger/LoggerFactory/等“注入”SLF4J 的东西。对象,所以我不知道如何注入这些类加载器,以便它们org.slf4j.impl.Logger在运行时返回我想要的:
我问这个问题是因为我喜欢 SLF4J 和针对 API 进行日志记录的好处,而且也喜欢 DI 的好处。有办法让这项工作发挥作用吗?提前致谢!
我相信这是不可能的(除非你做了一些非常麻烦的事情,比如为你的应用程序创建子类加载器的容器......类似的东西)
SLF4j 具有可替换实现的基本思想是通过提供绑定器库,org.slf4j.impl.StaticLoggerBinder并且 SLF4J API 将通过类加载器查找此类。因此,如果类路径中有超过 1 个绑定器,则无法区分org.slf4j.impl.StaticLoggerBinder它们提供的 s。考虑到日志框架甚至在 DI 发生之前就已初始化,DI 框架不会对此提供帮助。
除非SLF4J将来改变它的设计,否则我们没有太多办法。而且,我怀疑 SLF4J 是否有可能改变其设计。因为我们无法告诉 DI 容器 Logging 初始化是每个人都依赖的。我相信还有更多的原因使它几乎不可能实现。
不过,我有疑问的是,这真的和DI有关系吗?老实说,我没有看到通过将相应的 JAR 放入类路径来控制使用哪个日志记录绑定的问题。如果您想在运行时以编程方式控制它,我认为编写一个小容器来启动您的应用程序是可行的方法。然而,这仍然与DI无关。
| 归档时间: |
|
| 查看次数: |
1916 次 |
| 最近记录: |