1. Was ist ein Spring Boot Runner?
Ein Runner in Spring Boot ist ein spezieller Mechanismus, der es ermöglicht, benutzerdefinierten Code auszuführen, sobald der Spring-Anwendungskontext vollständig geladen ist, aber noch bevor die Anwendung tatsächlich für Anfragen bereit ist. Dies gibt Entwicklern die Möglichkeit, wichtige Aufgaben wie die Initialisierung von Daten, das Ausführen von Skripten oder die Konfiguration von Anwendungen zur Laufzeit direkt beim Start der Anwendung zu implementieren.
Wie funktioniert das?
In Spring Boot gibt es zwei zentrale Schnittstellen, die verwendet werden können, um diese Art von Code zu implementieren: CommandLineRunner
und ApplicationRunner
. Beide Schnittstellen dienen demselben Zweck, unterscheiden sich jedoch geringfügig in ihrer Funktionsweise und dem Umgang mit den Startparametern der Anwendung.
2. CommandLineRunner
Der CommandLineRunner
ist eine Schnittstelle, die es dir erlaubt, Code auszuführen, indem du die Methode run(String... args)
implementierst. Die Methode wird mit den Argumenten aufgerufen, die der Anwendung beim Start übergeben wurden.
Beispiel
import org.springframework.stereotype.Component;
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String… args) throws Exception {
System.out.println(„Application started with CommandLineRunner“);
for (String arg : args) {
System.out.println(„Arg: „ + arg);
}
// Weitere Initialisierungsaufgaben hier
}
}
In diesem Beispiel wird der MyCommandLineRunner
beim Start der Anwendung ausgeführt, und die übergebenen Argumente werden in der Konsole ausgegeben.
3. ApplicationRunner
Der ApplicationRunner
ist ähnlich wie der CommandLineRunner
, bietet jedoch etwas mehr Struktur, indem er die Argumente in eine ApplicationArguments
-Instanz kapselt. Diese Instanz bietet Methoden, um die Argumente einfacher zu verarbeiten, z.B. um zwischen Optionen und non-option-Argumenten zu unterscheiden.
Beispiel
import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component;
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(„Application started with ApplicationRunner“);
boolean debug = args.containsOption(„debug“);
System.out.println(„Debug mode: „ + debug);
for (String name : args.getNonOptionArgs()) {
System.out.println(„Non-option arg: „ + name);
}
// Weitere Initialisierungsaufgaben hier
}
}
Hier sieht man, dass der ApplicationRunner
zusätzlich zu den einfachen Argumenten auch Optionen verarbeiten kann. Wenn die Anwendung mit dem Argument --debug
gestartet wird, kann dies im Code erkannt und entsprechend gehandelt werden.
4. Welchen Runner sollte man verwenden?
Beide Runner haben ihre Vorzüge, aber die Wahl hängt von deinem spezifischen Anwendungsfall ab:
- Einfachheit: Wenn du keine komplexe Argumentverarbeitung benötigst und einfach nur Code beim Start ausführen möchtest, reicht der
CommandLineRunner
aus. - Komplexität: Wenn du eine detailliertere Kontrolle über die übergebenen Argumente benötigst, ist der
ApplicationRunner
die bessere Wahl.