22 Bootstrapping einer Spring-Boot-Anwendung

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.

22.1 Der Einstiegspunkt

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.

22.2 Was @SpringBootApplication bedeutet

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.

22.3 Der Bootstrap-Prozess

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.

22.4 Kommandozeilenargumente

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.

22.5 ApplicationRunner und CommandLineRunner

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.

22.6 Startup-Events

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.

22.7 Graceful Shutdown

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: 30s

Die Anwendung wartet bis zu 30 Sekunden auf laufende Requests, bevor sie endgültig stoppt.

22.8 Das Ergebnis

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.