java—如何多次初始化具有不同依赖关系的同一组件?

velaa5lx  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(257)

我目前有一个spring服务通过自动生成的代码使用rest服务。我放置了一个内部接口,以便从rest接口进行抽象,因为它仍在开发中。
rest服务实际上是同一主机上的两个服务。所以我生成了两次代码,有两个组件可以注入到我的内部接口实现中。
在接口实现中,我确实通过@postconstruct调整rest客户机组件的基本路径,因为url依赖于部署环境。
到目前为止效果还不错。尽管我认为最好不要在内部接口实现中修改基本路径,而是在另一个地方修改。谢谢你的提示。

问题

现在是棘手的部分。我使用的rest服务在环境中多次存在,并且具有不同的数据。有时有两次,有时有三次,依此类推。我们网站的用户应该能够选择他想消费的后端。关于哪些服务后端可用的信息应该可以针对环境进行配置。
为了能够配置这些依赖于环境的属性,我考虑在属性中添加一个Map,例如:
服务名称:url
第二个名称:url
等等。此Map将包含始终存在的服务的默认值。通过环境变量可以覆盖它以列出更多的后端服务。
所以,现在我想能够路由到所选的后端服务的网站请求。我的想法是,我需要某种服务。该服务拥有与不同后端示例的内部接口,并且可以基于名称标识要使用的接口。
现在的问题是,如何用spring来构建它?更具体地说:
如何使用不同的依赖关系构建多个时间段的internalrestclient?
如何区分/识别和使用它们?
非常感谢您提前提出的建议。

代码示例

内部rest接口

public interface InternalRestClient {

    String someAbstractMethodUsingBothServices(String someDate);
}

实施

@Service
public class InternalRestClientImpl implements InternalRestClient{

    @Value("${url}")
    private String url;

    private FirstRestService firstService;
    private SecondRestService secondService;

    public InternalRestClientImpl(FirstRestService firstService, SecondRestService secondService) {
        this.firstService = firstService;
        this.secondService = secondService;
    }

    @PostConstruct
    void correctPaths() {
        firstService.setBasePath(url);
        secondService.setBasePath(url);
    }

    @Override
    public String someAbstractMethodUsingBothServices(String someDate) {
        return null;
    }
}

自动生成的openapi组件

@Component
public class FirstRestService {

    private String basePath;

    public void setBasePath(String basePath) {
        this.basePath = basePath;
    }

    // some methods

}

@Component
public class SecondRestService {

    private String basePath;

    public void setBasePath(String basePath) {
        this.basePath = basePath;
    }

    // some other methods

}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题