Bootstrapping ist der Prozess, der eine Anwendung von “nichts” zu “laufend” bringt. Bei Spring Boot passiert dabei erstaunlich viel – und du musst fast nichts davon selbst tun.
Jede Java-Anwendung braucht eine main-Methode. Bei
Spring Boot ist sie minimal:
@SpringBootApplication
public class ArcadeHighscoreApplication {
public static void main(String[] args) {
SpringApplication.run(ArcadeHighscoreApplication.class, args);
}
}Zwei Zeilen aktiver Code. Der Rest ist Framework-Magie.
Die Annotation ist eine Kombination aus drei anderen:
@SpringBootConfiguration: Markiert die Klasse als Konfigurationsquelle. Spring liest hier definierte Beans.
@ComponentScan: Aktiviert den Component Scan ab diesem Package.
@EnableAutoConfiguration: Schaltet die Auto-Konfiguration ein. Spring Boot analysiert den Classpath und konfiguriert passende Beans.
SpringApplication.run() startet eine Kette von
Ereignissen:
Environment laden: Properties aus
application.yaml, Umgebungsvariablen,
Kommandozeilenargumente werden zusammengeführt.
Banner ausgeben: Das ASCII-Art-Logo erscheint in der Konsole.
Context erstellen: Der ApplicationContext wird instanziiert.
Beans registrieren: Component Scan findet alle Komponenten, Bean-Definitionen werden erstellt.
Auto-Configuration: Spring Boot prüft den Classpath und konfiguriert erkannte Technologien.
Embedded Server: Tomcat (oder Jetty/Netty) startet und bindet den konfigurierten Port.
ApplicationReadyEvent: Signal an alle Listener, dass die Anwendung bereit ist.
Die args aus main() werden an Spring Boot
durchgereicht. Du kannst Properties überschreiben:
# Port ändern
./gradlew bootRun --args='--server.port=9090'
# Profil aktivieren
./gradlew bootRun --args='--spring.profiles.active=dev'
# Mehrere Argumente
./gradlew bootRun --args='--server.port=9090 --spring.profiles.active=dev'Kommandozeilenargumente haben höchste Priorität – sie überschreiben alles andere.
Manchmal muss beim Start Code ausgeführt werden. Spring Boot bietet zwei Interfaces:
@Component
public class StartupLogger implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Anwendung gestartet!");
System.out.println("Argumente: " + args.getOptionNames());
}
}Oder mit rohen String-Argumenten:
@Component
public class DataInitializer implements CommandLineRunner {
private final GameRepository repository;
public DataInitializer(GameRepository repository) {
this.repository = repository;
}
@Override
public void run(String... args) {
if (repository.count() == 0) {
repository.save(new Game("pacman", "Pac-Man", "...", 3333360));
System.out.println("Initialdaten geladen");
}
}
}Diese Methoden werden aufgerufen, nachdem der Context vollständig initialisiert ist, aber bevor die Anwendung Requests entgegennimmt.
Spring Boot feuert Events während des Starts. Du kannst darauf reagieren:
@Component
public class StartupEventListener {
@EventListener
public void onApplicationReady(ApplicationReadyEvent event) {
System.out.println("Anwendung ist bereit!");
}
@EventListener
public void onContextRefreshed(ContextRefreshedEvent event) {
System.out.println("Context wurde initialisiert");
}
}| Event | Zeitpunkt |
|---|---|
ApplicationStartingEvent |
Ganz am Anfang |
ApplicationEnvironmentPreparedEvent |
Environment ist bereit |
ApplicationContextInitializedEvent |
Context existiert, Beans noch nicht |
ApplicationPreparedEvent |
Beans geladen, noch nicht initialisiert |
ContextRefreshedEvent |
Context vollständig initialisiert |
ApplicationStartedEvent |
Anwendung gestartet |
ApplicationReadyEvent |
Anwendung bereit für Requests |
Für die meisten Fälle reicht ApplicationReadyEvent – der
sicherste Zeitpunkt für Initialisierungslogik.
Spring Boot fährt genauso kontrolliert herunter, wie es startet:
Aktiviere Graceful Shutdown in der Konfiguration:
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30sDie Anwendung wartet bis zu 30 Sekunden auf laufende Requests, bevor sie endgültig stoppt.
Nach dem Bootstrap hast du:
Alles in typischerweise 2-3 Sekunden. Ohne eine einzige Zeile XML, ohne manuelle Server-Installation, ohne Deployment-Deskriptoren. Das ist Spring Boot.