Als einfacher Einsteckmechanismus mit Spring kann er wie unten beschrieben sehr einfach realisiert werden.
Einfacher Einsteckmechanismus durch DI-Container realisiert https://blog.ik.am/entries/331
Hier betrachten wir auch die Reihenfolge, in der die Stecker eingesetzt werden. Es ist sehr einfach, fügen Sie einfach "@ Priority" hinzu, um die Reihenfolge zu definieren.
MyPlugin.java
public interface MyPlugin {
String execute();
}
MyPluginService.java
@Service
public class MyPluginService {
@Autowired
List<MyPlugin> plugins;
public List<String> execute() {
return plugins.stream().map(p -> p.execute()).collect(Collectors.toList());
}
}
PluginController.java
@RestController
public class PluginController {
@Autowired
MyPluginService myPluginService;
@GetMapping("plugins")
public List<String> plugins() {
return myPluginService.execute();
}
}
@Component
@Priority(10)
public class Fuga1Plugin implements MyPlugin {
@Override
public String execute() {
return "Fuga1Plugin";
}
}
@Component
@Priority(50)
public class Hoge1Plugin implements MyPlugin {
@Override
public String execute() {
return "Hoge1Plugin";
}
}
@Component
@Priority(100)
public class Fuga2Plugin implements MyPlugin {
@Override
public String execute() {
return "Fuga2Plugin";
}
}
@Component
@Priority(200)
public class Hoge2Plugin implements MyPlugin {
@Override
public String execute() {
return "Hoge2Plugin";
}
}
Ausführungsergebnis
$ curl http://localhost:8080/plugins | jq .
[
"Fuga1Plugin",
"Hoge1Plugin",
"Fuga2Plugin",
"Hoge2Plugin"
]
Ab Spring 4.1 wird übrigens empfohlen, "@ Priority" anstelle von "@ Order" zu verwenden. Wenn Sie "@ Conditional" verwenden, können Sie auch die zutreffenden Bedingungen schreiben, aber es scheint, dass Sie nicht viel Gelegenheit haben werden, sie zu verwenden.
Recommended Posts