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.
CommandLineRunner | ApplicationRunner | |
|---|---|---|
| Argüman | Ham String... | Ayrıştırılmış ApplicationArguments |
| Ne zaman | Uygulama hazır olunca, bir kez | Aynı |
| 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
@PostConstructdaha uygundur (runner tüm uygulama hazır olunca çalışır, bean'e özel değildir). - Üretimde şema/veri geçişleri için
CommandLineRunneryerine 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 gerekir1// 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}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.