如何处理 Spring Boot 中服务的可选服务依赖?

How to handle optional service dependency of service in Spring Boot?

我有一项名为 InformationService 的服务。它可选地取决于 ReleaseService。如果设置了 属性 external.releaseservice.urlInformationService 应该向它发出请求并用聚合数据丰富它自己的响应。
但是,如果未定义 url,则响应应简单地 return 一个字符串,如 not available 用于相关字段。

实现此目的的 spring 启动方式是什么?将 Optional<ReleaseService> 注入 InformationService?还有其他模式吗?

您可以通过三种方式实现这一目标。

@Autowired(必需=假)

这可行,但它需要字段注入,众所周知,这不利于单元测试。

@Autowired(required = false)
private ReleaseService releaseService;

Java可选类型

如您所说,Optional 也可以完成这项工作,它允许您坚持使用构造函数注入。这是我建议的方法。

Spring的对象提供者

还有一个 ObjectProvider 专门为注入点设计的,您可以使用它来实现如下目的。

public InformationService(ObjectProvider<ReleaseService> releaseServiceProvider) {
    this.releaseService = releaseServiceProvider.getIfAvailable();
}

它比较麻烦,因此我会避免它。如果 none 可用,则允许您指定默认实例,但我想这不是您需要的。