gpt4 book ai didi

java - ServiceLoader和始终有效的服务

转载 作者:行者123 更新时间:2023-12-01 19:31:46 31 4
gpt4 key购买 nike

我正在尝试为模块化、干净的架构创建蓝图。我要遵循的原则之一是“所有对象必须始终有效”。

此外,我正在使用模块系统(java 11)。

问题是我无法通过服务的构造函数注入(inject)服务的依赖项,因此无法遵守上述原则。

使用 ServiceLoader 时,是否有任何非显而易见的方法可以通过构造函数潜入参数?我很乐意在 Main 中单独使用反射来完成此任务。

我一直在考虑的替代方案:

  • 使用另一种类似于“初始化”的方法,它需要依赖项。此方法或任何其他基于 setter 的方法的问题在于对此方法的调用与实际使用服务之间的时间耦合;或者换句话说,违反了上述原则
  • 使“服务”不是一个实际的服务,而是一个只有一个方法的工厂,它通过参数获取依赖关系,类似于上一点。我对这种方法的问题是这样做会产生意外的复杂性。

到目前为止,我的意图是采取第二种方法,但我不喜欢偶然的复杂性。此外,每个服务将提供多种操作(这意味着在这种情况下时间耦合是真实存在的)。

我知道与此相关的另一个问题,但我很好奇是否可以使用较新的 java 版本和/或反射。

最佳答案

使用factory method pattern .

服务加载器是一种工厂方法模式,但正如您所说,它不支持参数。

因此将从服务加载器获取的类设为工厂类,即具有带参数的工厂方法的类。这样您现在就可以创建完全初始化的目标对象,即有效的。

最好让工厂类完成服务加载器部分,例如设计类的方式与 JDBC 类似。

在 JDBC 中,您使用工厂类 DriverManager并调用例如getConnection​(String url, String user, String password) .

工厂类将执行ServiceLoader逻辑来查找 Driver 的实现接口(interface),基本上是一个工厂接口(interface)。然后它将调用 connect​(String url, Properties info)方法来创建实际的 Connection 对象。

你应该做类似的事情。

关于java - ServiceLoader和始终有效的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517073/

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