标题可能有点复杂,但我没有看到任何其他方式来表达我的问题。
我正在开发一个项目,其中通过加载几个文件并将它们转换为 Java 组件来初始化某些组件,而其他组件则由 ServiceLoader 加载,因为它们已经作为 Java 类存在。然后,所有这些对象都由提供者映射,以便可以从那里检索它们。
public class Provider {
private Map<String, Component> map;
public Provider() {
/*
* Load files, transform, and add them to the map
* with keys being their names
*/
/*
* Load Java components and add them to the map
* with keys being their names
*/
}
public Component getComponent(String name) {
return this.map.get(name);
}
}
public interface Component {
public Number execute();
}
我现在要直接在 Java 中添加更多组件,但它们更多是复合的,这意味着它们使用以前加载到提供程序中的组件。因此,我必须从提供者那里收集所需的组件,将它们添加到组合中,然后将组合本身添加到提供者中。
public class Composite implements Component {
private Component component1, component2;
public Composite() {
Provider provider = new Provider();
this.component1 = provider.getComponent("Comp1");
this.component2 = provider.getComponent("Comp2");
}
public Number execute() {
return this.component1.execute() + this.component2.execute();
}
}
只需将复合材料添加到特定的 META-INF 文件即可将复合材料添加到 Provider。然后它将由 ServiceLoader 处理。
对我来说,这在某种程度上是一种循环依赖。我必须在 META-INF 文件中定义 ServiceLoader 应该收集哪些 Java 类。这也将包括新实施的复合材料。但是,只要提供者已加载所有其他指标,就无法创建该指标。
有什么模式或不同的方法可以用来解决这个问题吗?