java - Spring - 基于带有@Autowired 字段的@Service 创建@Bean 导致@Autowired 字段出现NullPointerException

标签 java spring testing

我有以下上下文:

@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/

相关文章:

java - Spring Boot App 适用于本地 Tomcat 但不适用于远程服务器

java - 如何使用hibernate从多个表查询中获取数据?

java - 如何返回到 Java 中的 JFrames

java - 禁用 "-boot"分发

ruby-on-rails - FactoryGirl Rspec 模型测试失败

java - UML、C++、Java 中的符号

在 Spring 应用程序中打开模式对话框的 JavaScript 函数

spring - 如何在用户登录时设置 CORS

java - 在 mockito 的 thenReturn 中打印语句

scala - 使用@Inject 注释导致var 被识别为@Test?