在spring中将bean注入到手动实例化的类中



我有一些正在使用的域类。登录它们是有要求的,但看起来spring不允许您将bean注入手动实例化的对象中。我不想把记录器作为参数传递给构造函数,因为这个记录器是一个bean,我正在自动连接到我的大多数类中。它看起来有点像这样:

public class MainClass {
private Logger logger;
public MainClass(Logger logger) {
this.logger = logger;
}
public void doThing() {
//..do stuff
DomainClass domainObject = new DomainClass(//params);
}
}
public class DomainClass {
//bunch of fields

//field I want to autowire
private Logger logger;
}
@Component
public class Logger {
//stuff
}

有没有任何方法可以在不将记录器作为参数传递的情况下实现这一点?

有很多很棒的Java日志记录库,它们不需要拖动记录器。例如,SLF4J中的日志记录如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MainClass {
private static final Logger logger = LoggerFactory.getLogger(MainClass.class);
public MainClass() { }

public void doThing(String userInput) {
...
logger.info("Info message");
logger.debug("Debug message");
logger.error("Error message with an argument: {}", userInput);
...
}
}

正如您所看到的,SLF4J不要求您在IoC容器中注册记录器,而是依赖于静态工厂方法LoggerFactory.getLogger

我只是无法强调Java日志记录库与任何手工编写的日志记录程序相比有多好和可配置。我建议您使用现有的、建立良好的日志库,例如Spring Boot默认使用的SLF4J+Logback组合。

如果您的用例不能使用第三方日志库,请考虑在IoC容器中与记录器一起管理MainClass和其他类似类。这样,您就可以在指尖获得Spring自动布线的全部功能。Spring对您自己创建的对象无能为力。Spring只对其IoC容器中的对象进行操作。

最新更新