gpt4 book ai didi

Spring Boot - 如何使用非默认构造函数 @Autowired 一个 Bean?

转载 作者:行者123 更新时间:2023-12-04 22:57:05 26 4
gpt4 key购买 nike

我发现了很多关于 @Autowired 与非空构造函数的用法的信息 here .但我什至无法解决我目前的问题。

我有一个用于记录的界面。我正在记录数据库中的每个条目。出于这个原因,对我来说知道类名很重要,哪个类使用记录器。

我的第一个想法:创建一个新的 Logger 实现,它有一个非空的构造函数。因此,在创建此记录器的新实例时,您必须设置一个名称。

我的界面如下所示:

public interface Logger{
public void log(String name, String msg);
}

它的实现如下所示:
@Service
public class LoggerImpl implements Logger{
private String className;

LoggerImpl(String className){ this.className = className }

@Override
public void log(String name, String msg) { // print and save in the database }
}

在我的应用程序的任何地方我都想使用这个记录器 - 接口(interface)。例如,在某些业务类中,我以这种方式使用 Logger:
@Service
public class ServiceName {
private Logger logger;

@Autowired
public ServiceName(){
logger = new LoggerImpl("ServiceName");
}

public void someMethod(){
logger.log("name", "this is a log!");
}
}

但是我的应用程序告诉我,他没有数据库通信并抛出 NullPointerException ,同时将日志保存在数据库中。在创建非空构造函数之前,此通信有效。所以我的猜测是,当我手动创建这个 LoggerImpl 时,这个对象不再在 spring 应用程序上下文中。有什么想法可以解决吗?谢谢你。 编辑 :我正在使用 Spring Boot,但我没有任何 XML 文件。

最佳答案

您可能想看看新的 InjectionPoint

@Configuration
public class LoggerConfig {

@Bean
@Scope("prototype")
public Logger logger(InjectionPoint injectionPoint) {
//this is the class where the logger will be used
Class<?> theClassYouAreLookingFor = injectionPoint.getMember().getDeclaringClass();
return findOrCreateYourLogger(theClassYouAreLookingFor);
}
}

使用 Logger就像你通常对任何其他 Bean 所做的那样注入(inject)它。

关于Spring Boot - 如何使用非默认构造函数 @Autowired 一个 Bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40424628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com