Java 基于maven的项目中的循环依赖/依赖倒置(令人尴尬,但相当容易)
我正在从事一个maven管理的Java项目。目标是从JSON文件中读取任务并对其进行处理。我们还试图保持整个项目模块化。因此,我们有一个核心项目和许多模块。 基本思想是,核心定义任务,如何检索它们。。。模块正在执行该任务 我读过很多关于循环依赖或依赖反转的书,以及如何在理论上避免它们。然而,我无法将这些例子和方法付诸实践,我不太确定这是否是我的问题。因此我希望有人能给我指出正确的方向。以下是我的问题: 我从JSON文件中读取任务,并使用GSON将它们转换为数组Java 基于maven的项目中的循环依赖/依赖倒置(令人尴尬,但相当容易),java,json,maven,dependency-injection,circular-dependency,Java,Json,Maven,Dependency Injection,Circular Dependency,我正在从事一个maven管理的Java项目。目标是从JSON文件中读取任务并对其进行处理。我们还试图保持整个项目模块化。因此,我们有一个核心项目和许多模块。 基本思想是,核心定义任务,如何检索它们。。。模块正在执行该任务 我读过很多关于循环依赖或依赖反转的书,以及如何在理论上避免它们。然而,我无法将这些例子和方法付诸实践,我不太确定这是否是我的问题。因此我希望有人能给我指出正确的方向。以下是我的问题: 我从JSON文件中读取任务,并使用GSON将它们转换为数组 [ { "name":
[
{
"name": "Do_SOMETHING_1",
"arguments": "myArgs, myArgs_devided_by_comma",
"network": [
{
"start_ip": "192.168.1.1",
"end_ip": "192.168.1.255"
}
]
},
{
"name": "Do_SOMETHING_2",
"arguments": "myArgs, myArgs_devided_by_comma"
}
]
我的Task.class如下所示:
public class Task {
private String name;
private String arguments;
private List<network> network;
public String getType() {
return command.toLowerCase();
}
public String[] getArgs() {
String[] args = arguments.split("\\,");
return args;
}
@Override
public String toString() {
return name + " - " + arguments;
}
}
class network {
private String start_ip;
private String end_ip;
@Override
public String toString() {
return start_ip + " - " + end_ip;
}
}
public class Job {
public static Task[] task;
ExecutorService executor = Executors.newFixedThreadPool(25);
public void run() {
try {
fetch_jobs();
} catch (IOException e) {
//Handle e
}
process_jobs();
executor.shutdown();
while (!executor.isTerminated()) {
//Wait until exit
}
}
public void fetch_jobs() throws UnsupportedEncodingException, IOException {
Reader reader = new InputStreamReader(Job.class.getResourceAsStream("/tasks.json"), "UTF-8");
Gson gson = new GsonBuilder().create();
task = gson.fromJson(reader, Task[].class);
}
private void process_jobs() {
for (int i = 0; i < task.length; i++) {
switch(task[i].getType()) {
case "Do_SOMETHING_1":
Runnable worker1 = new Do_SOMETHING_1(task[i]);
executor.execute(worker1);
break;
case "Do_SOMETHING_2":
Runnable worker2 = new Do_SOMETHING_2(task[i]);
executor.execute(worker2);
break;
default:
//Do Nothing
}} }
}
为了处理这些任务,我编写了一个Jobs类,它检查作业,构建任务数组,然后根据JSON文件指定的内容尝试实例化一个新类来处理任务。看起来是这样的:
public class Task {
private String name;
private String arguments;
private List<network> network;
public String getType() {
return command.toLowerCase();
}
public String[] getArgs() {
String[] args = arguments.split("\\,");
return args;
}
@Override
public String toString() {
return name + " - " + arguments;
}
}
class network {
private String start_ip;
private String end_ip;
@Override
public String toString() {
return start_ip + " - " + end_ip;
}
}
public class Job {
public static Task[] task;
ExecutorService executor = Executors.newFixedThreadPool(25);
public void run() {
try {
fetch_jobs();
} catch (IOException e) {
//Handle e
}
process_jobs();
executor.shutdown();
while (!executor.isTerminated()) {
//Wait until exit
}
}
public void fetch_jobs() throws UnsupportedEncodingException, IOException {
Reader reader = new InputStreamReader(Job.class.getResourceAsStream("/tasks.json"), "UTF-8");
Gson gson = new GsonBuilder().create();
task = gson.fromJson(reader, Task[].class);
}
private void process_jobs() {
for (int i = 0; i < task.length; i++) {
switch(task[i].getType()) {
case "Do_SOMETHING_1":
Runnable worker1 = new Do_SOMETHING_1(task[i]);
executor.execute(worker1);
break;
case "Do_SOMETHING_2":
Runnable worker2 = new Do_SOMETHING_2(task[i]);
executor.execute(worker2);
break;
default:
//Do Nothing
}} }
}
Do_SOMETHING_1和Do_SOMETHING_2是maven模块,目前依赖于核心,因此它们知道任务是什么,因此我可以传递任务类型变量task[I]
问题是,在核心应用程序中,我需要调用Do-SOMETHING_1和Do-SOMETHING_2。因此,核心需要依赖于模块,我想这是不好的。但是,我如何才能传递任务,以便Do_某事\u 1能够访问这些信息。例如,网络和参数
谢谢你的帮助,因为我在这里压力很大
层次结构:
模块化取决于核心
模化的东西取决于核心
CORE依赖于ModuleDo_SOMETHING_1您不应该像那样将实现类硬编码到交换机中;它从本质上消除了多态性的所有优点。相反,使用一个抽象工厂来实例化操作的Runnable
在这种情况下,Java的服务提供者接口是完美的;它本质上允许您在运行时扫描某些接口的实现插件,使用起来并不困难。请参阅javax.crypto API,以了解其在实践中的工作原理。您好!谢谢你的回复。但是我还是很困惑。我试图围绕任务构建一个抽象类。这样做会破坏GSON映射。你介意澄清一下你的方法吗?甚至可以整合我上面的例子。再次感谢你,很抱歉让你这么痛苦-斯蒂芬妮