2

我正在做没有框架(没有spring/guice)的依赖注入,只是普通的java(我需要)。我的问题是关于记录器的记录器呢?我通常将它实例化

private static logger = Logger.getLogger(myclass); 

但这不是依赖注入,我应该将记录器传递给每个 ctor 吗?这看起来很奇怪......那么如何处理记录器和依赖注入?

PS我更喜欢带有ctor的DI而不是setter,这样我就知道我的课程需要什么。

谢谢

4

4 回答 4

7

一种解决方案是使用外观框架,例如slf4jLogger.getLogger(...)然后实际上是获取日志库并使用它。更改日志库是一个简单的配置问题。

Java 或 (SLF4J) 的简单日志外观作为各种日志框架的简单外观或抽象,例如 java.util.logging、log4j 和 logback,允许最终用户在部署时插入所需的日志框架。

所以它与使用 DI 非常相似,但在这种情况下可能更合适。

于 2013-01-04T12:13:24.713 回答
4

记录器是大多数人不使用 DI 的一个例子,即使他们有 DI 框架。

没有什么可以阻止您通过 DI 使用它们,例如用于单元测试。

class MyClass {
    final Logger logger;

    public MyClass() {
        this(Logger.getLogger(getClass().getName());
    }

    public MyClass(Logger logger) {
        this.logger = logger;
    }
}

顺便说一句:我在没有框架的情况下使用 DI,并且我尝试将可以记录的组件数量保持在最低限度。例如,我有可以接收错误和警告的侦听器接口。对于那些做记录的人,我让他们拥有自己的记录器。

于 2013-01-04T12:13:22.370 回答
2

任何极端的好主意都会变得荒谬......所以不要试图注入所有东西 - 类通常可以并且应该控制自己的一些东西,记录器就是其中之一。顺便说一句:除非您想在初始化后更改记录器,否则最好添加finalprivate static,这是一种很好的做法。

于 2013-01-04T12:21:48.067 回答
1

注入静态属性是没有意义的。首先,您应该决定是要使用每个类(静态)还是每个实例记录器。看看When Static References to Log objects can be used , or at this question。这些帖子还展示了一些配置记录器的方法。

于 2013-01-04T12:54:29.840 回答