我正在做没有框架(没有spring/guice)的依赖注入,只是普通的java(我需要)。我的问题是关于记录器的记录器呢?我通常将它实例化
private static logger = Logger.getLogger(myclass);
但这不是依赖注入,我应该将记录器传递给每个 ctor 吗?这看起来很奇怪......那么如何处理记录器和依赖注入?
PS我更喜欢带有ctor的DI而不是setter,这样我就知道我的课程需要什么。
谢谢
一种解决方案是使用外观框架,例如slf4j。Logger.getLogger(...)
然后实际上是获取日志库并使用它。更改日志库是一个简单的配置问题。
Java 或 (SLF4J) 的简单日志外观作为各种日志框架的简单外观或抽象,例如 java.util.logging、log4j 和 logback,允许最终用户在部署时插入所需的日志框架。
所以它与使用 DI 非常相似,但在这种情况下可能更合适。
记录器是大多数人不使用 DI 的一个例子,即使他们有 DI 框架。
没有什么可以阻止您通过 DI 使用它们,例如用于单元测试。
class MyClass {
final Logger logger;
public MyClass() {
this(Logger.getLogger(getClass().getName());
}
public MyClass(Logger logger) {
this.logger = logger;
}
}
顺便说一句:我在没有框架的情况下使用 DI,并且我尝试将可以记录的组件数量保持在最低限度。例如,我有可以接收错误和警告的侦听器接口。对于那些做记录的人,我让他们拥有自己的记录器。
任何极端的好主意都会变得荒谬......所以不要试图注入所有东西 - 类通常可以并且应该控制自己的一些东西,记录器就是其中之一。顺便说一句:除非您想在初始化后更改记录器,否则最好添加final
到private static
,这是一种很好的做法。
注入静态属性是没有意义的。首先,您应该决定是要使用每个类(静态)还是每个实例记录器。看看When Static References to Log objects can be used , or at this question。这些帖子还展示了一些配置记录器的方法。