我有以下上下文:
@Configuration
@ComponentScan
public class MyContext {
@Bean
public Logger getLogger() {
return LoggerFactory.getLogger(MyContext.class);
}
@Bean
@Autowired
public RequestSpecification getRequestSpecification(RestServiceImpl restService) {
return restService.getService();
}
}
在我的服务中,我有 @Autowired
字段(Logger):
@Service
public class RestServiceImpl {
@Autowired
Logger logger;
}
现在问题来了。当我尝试在其他服务中重用我的 RequestSpecification
时:
@Service
public class RequestWrapperForMyEndpoint {
@Value("${rest.service.url}")
private String SERVICE_URL;
@Autowired
private RequestSpecification restService;
}
我遇到了 NullPointerException
。因为 Logger
没有被注入(inject)到 RestServiceImpl
类中。
这是什么原因?
最佳答案
我对您的具体问题的非常简单的回答是:不要注入(inject)记录器。
@Service
public class RestServiceImpl {
private static Logger logger = LoggerFactory.getLogger(RestServiceImpl.class);
}
论点#1:无论你在一个类中记录什么,都应该用那个类的记录器来完成。您不应该使用从 MyContext 初始化的记录器从 RestServiceImpl 中记录。减少记录器的数量没有意义。每个类应该有一个记录器,它不会影响您的性能,因为创建记录器的成本非常低。
论点#2:没有实例化记录器那么便宜的是 Autowiring 一个 bean。 Autowiring /并且可能在两者之间有一个自动生成的代理 bean 是非常昂贵的。
论点 3:有人可能会争辩说, Autowiring 所有内容是一种很好的设计。那么你仍然可以争辩 - 是的,除了不依赖于任何其他东西的对象之外的所有东西。记录器就是这些异常(exception)之一。根据定义,它不依赖于任何其他内容。
抱歉 - 但我对您的实际 Autowiring 问题没有任何好主意。
关于java - Spring - 基于带有@Autowired 字段的@Service 创建@Bean 导致@Autowired 字段出现NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47281672/