Java 无明确规范的弹簧注入式Log4j记录器
我正在使用基于SpringXML的DI来创建我的类 另外,我使用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
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;
}
...
}