Eğitim Portalı/Spring Boot/Spring Boot Runners (Başlangıç Görevleri)
Spring Boot03-spring-boot/09-runners

Spring Boot Runners (Başlangıç Görevleri)

Bir uygulama başladığında, ilk istekten önce bir kez çalışması gereken işler olur: önbellek ısıtma, başlangıç verisi yükleme (seed), bağlantı kontrolü, bir kuyruğu dinlemeye başlama, tek seferlik geçiş (migration). Sp…

Spring Boot Runners (Başlangıç Görevleri)

Bir uygulama başladığında, ilk istekten önce bir kez çalışması gereken işler olur: önbellek ısıtma, başlangıç verisi yükleme (seed), bağlantı kontrolü, bir kuyruğu dinlemeye başlama, tek seferlik geçiş (migration). Spring Boot bunun için iki standart arayüz sunar: CommandLineRunner ve ApplicationRunner. İkisi de uygulama tamamen ayağa kalktıktan sonra otomatik çalışır.

CommandLineRunner

Tek metodu run(String... args)'tır; uygulamaya verilen ham komut satırı argümanlarını alır:

@Bean
CommandLineRunner init() {
    return args -> {
        System.out.println("Uygulama başladı, hazırlık yapılıyor...");
    };
}

ApplicationRunner

CommandLineRunner ile aynı amaca hizmet eder, ama argümanları ayrıştırılmış olarak (ApplicationArguments) alır — opsiyonları (--debug) ve değerleri ayırır:

@Bean
ApplicationRunner runner() {
    return args -> {
        args.getOptionNames();          // --key biçimindeki opsiyonlar
        args.containsOption("debug");   // --debug verildi mi?
        args.getNonOptionArgs();        // opsiyon olmayan argümanlar
    };
}

Çalışma sırası: @Order

Birden çok runner varsa, sıralarını @Order belirler (küçük değer önce). Örnek 1 (./Ornek1.java) iki CommandLineRunner ve bir ApplicationRunner@Order ile sıralı çalıştırır; çıktılar uygulama başlangıcında görünür.

CommandLineRunnerApplicationRunner
ArgümanHam String...Ayrıştırılmış ApplicationArguments
Ne zamanUygulama hazır olunca, bir kezAynı
Sıralama@Order@Order

Ne zaman kullanılır, ne zaman kullanılmaz?

Kullan: Başlangıç verisi yükleme (geliştirme/test), önbellek ısıtma, başlangıç doğrulamaları, bir dış sistemi dinlemeye başlama, CLI tarzı toplu işler (batch) için tetikleyici.

Dikkat / alternatifler:

  • Bir bean oluşturulurken yapılacak başlatma için @PostConstruct daha uygundur (runner tüm uygulama hazır olunca çalışır, bean'e özel değildir).
  • Üretimde şema/veri geçişleri için CommandLineRunner yerine Flyway/Liquibase kullan (sürümlü, güvenli).
  • Runner içinde atılan istisna uygulamanın başlamasını engeller (bu bazen istenir — "geçersiz yapılandırmayla başlama").

Özet

Spring Boot'ta uygulama başlangıcında bir kez kod çalıştırmanın iki yolunu öğrendik: ham argümanlı CommandLineRunner ve ayrıştırılmış argümanlı ApplicationRunner (Örnek 1); @Order ile sıralama ve ne zaman kullanılıp kullanılmayacağını (Flyway/@PostConstruct alternatifleri) gördük. Sırada, uygulamayı katmanlara ayıran yapı taşı: servis bileşenleri.

Kod Örnekleri(1)

Ornek1

ortam gerekir
Ornek1.java
1// Ornek1: CommandLineRunner ve ApplicationRunner — uygulama başlarken kod çalıştırma.
2// Çalıştırma: portal derleyip gömülü Tomcat ile başlatır; runner çıktıları başlangıçta görünür.
3package com.egitim.springboot.runners;
4
5import org.springframework.boot.ApplicationArguments;
6import org.springframework.boot.ApplicationRunner;
7import org.springframework.boot.CommandLineRunner;
8import org.springframework.boot.SpringApplication;
9import org.springframework.boot.autoconfigure.SpringBootApplication;
10import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
11import org.springframework.context.annotation.Bean;
12import org.springframework.core.annotation.Order;
13
14@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
15public class Ornek1 {
16
17    public static void main(String[] args) {
18        SpringApplication.run(Ornek1.class, args);
19    }
20
21    // CommandLineRunner: ham String[] argümanları alır. Uygulama hazır olunca BİR KEZ çalışır.
22    @Bean
23    @Order(1) // çalışma sırası (küçük önce)
24    CommandLineRunner ilkGorev() {
25        return args -> {
26            System.out.println("\n>>> [CommandLineRunner @Order(1)] uygulama başladı, hazırlık yapılıyor...");
27            System.out.println("    ham argümanlar: " + java.util.Arrays.toString(args));
28        };
29    }
30
31    @Bean
32    @Order(2)
33    CommandLineRunner ikinciGorev() {
34        return args -> System.out.println(">>> [CommandLineRunner @Order(2)] önbellek ısıtıldı / bağlantılar kontrol edildi");
35    }
36
37    // ApplicationRunner: argümanları ApplicationArguments olarak (opsiyon/değer ayrıştırılmış) alır.
38    @Bean
39    @Order(3)
40    ApplicationRunner uygulamaRunner() {
41        return (ApplicationArguments args) -> {
42            System.out.println(">>> [ApplicationRunner @Order(3)] opsiyon adları: " + args.getOptionNames());
43            System.out.println("    --debug verildi mi? " + args.containsOption("debug"));
44            System.out.println("    başlangıç görevleri tamamlandı.\n");
45        };
46    }
47}
canlı çalıştırma için ortam gerekir

Bu örnek Spring / Spring Boot (Gradle) ortamı gerektirir; tek dosya olarak java Ornek1.java ile çalışmaz. Orijinal portal bunu gömülü Tomcat / Spring context ile koşuyordu. Beklenen davranış yukarıdaki anlatım ve kodda açıklanmıştır.