Java 无明确规范的弹簧注入式Log4j记录器

Java 无明确规范的弹簧注入式Log4j记录器,java,spring,dependency-injection,log4j,Java,Spring,Dependency Injection,Log4j,我正在使用基于SpringXML的DI来创建我的类 另外,我使用log4j,并在每个需要它的类中注入org.apache.log4j.Logger作为构造函数参数 因此,我在Spring配置中有很多条目,如下所示: <bean id="myClass" class="com.myProject.MyClass"> ... <constructor-arg type="org.apache.log4j.Logger"> <bean cl

我正在使用基于SpringXML的DI来创建我的类

另外,我使用log4j,并在每个需要它的类中注入
org.apache.log4j.Logger
作为构造函数参数

因此,我在Spring配置中有很多条目,如下所示:

<bean id="myClass" class="com.myProject.MyClass">
    ...
    <constructor-arg type="org.apache.log4j.Logger">
        <bean class="org.apache.log4j.Logger" factory-method="getLogger">
            <constructor-arg value="com.myProject.MyClass"/>
        </bean>
    </constructor-arg>
</bean>
尽管它工作得很好,但我想知道是否有可能将记录器的
构造函数arg
默认为类名,创建的记录器应该传递给谁的构造函数

例如,Unity DI和log4net就是这样,它们在某种程度上类似于.Net


更新:

我看到了注入
Logger
而不是在类中初始化它的两个原因

首先,像
private final Logger=LogManager.getLogger(MyClass.class)这样的语句通常是复制粘贴的,因此它们很容易在记录器名称中出错


Moverover,我想用单元测试来介绍错误日志记录,例如,将模拟的
Logger
传递到构造函数中,然后验证在一些错误操作之后是否调用了
Logger.error

将记录器作为构造函数参数传递有点可怕。 还有,你反对使用
private…之类的。。。记录器
似是而非

  • “复制粘贴容易出错。” 真正的复制粘贴技术容易出错, 但当您希望每个记录器具有唯一的名称(以便识别日志消息的来源)时, 您需要在每个类中声明一个记录器
  • “我想在单元测试期间模拟我的记录器。” 虽然用模拟变量替换最终成员变量是不合理的, 用mock替换非最终成员变量非常容易。 为此,, 您应该始终声明类级记录器如下:
    private static Logger…blah
    。 明确地 不要使用最终记录器。 一旦伐木工人不是最终的, 使用反射将其替换为模拟

  • 为什么不使用私有静态最终记录器Logger=LogManager.getLogger(MyClass.class)?如果需要,您可以使用ProjectLombok的注释@Log自动注入记录器。这里有一个例子:@DirkDeyne我想注入一个记录器,例如在单元测试中模拟它并验证是否记录了错误。有更好的方法来测试是否发生了日志记录。
    package com.myProject;
    
    import org.apache.log4j.Logger;
    
    public class MyClass {
        private final Logger logger;
    
        public MyClass (
                ...
                Logger logger) {
            ...
            this.logger = logger;
        }
    
        ...
    }