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