Ne Zaman Hangisi ve Geçiş
Temel farkları gördükten sonra pratik soru şu: yeni bir projede hangisini seçmeli, var olan düz Spring projesini Boot'a taşımalı mı, taşırsan nasıl? Bu bölüm bu kararları netleştirir.
Ne Zaman Hangisi ve Geçiş
Temel farkları gördükten sonra pratik soru şu: yeni bir projede hangisini seçmeli, var olan düz Spring projesini Boot'a taşımalı mı, taşırsan nasıl? Bu bölüm bu kararları netleştirir.
Hangisini seçmeli?
Günümüzde yeni projelerin büyük çoğunluğu için doğru cevap Spring Boot'tur. Kurulum yükünü kaldırır, üretim araçlarını hazır getirir ve seni iş mantığına odaklar. Yine de tabloyu bilmek iyidir:
| Durum | Öneri |
|---|---|
| Yeni web/REST uygulaması, mikroservis | Spring Boot (neredeyse her zaman) |
| Hızlı prototip / MVP | Spring Boot (Initializr ile dakikalar) |
| Standart altyapı (DB, web, güvenlik) | Spring Boot (auto-config) |
| Mevcut, büyük, özel yapılandırılmış legacy sistem | Düz Spring'de kalmak mantıklı olabilir |
| Çok özel/sıra dışı altyapı, tam manuel kontrol şart | Düz Spring (veya Boot + bol özelleştirme) |
| Spring olmadan, minimal bağımlılık | Belki ikisi de değil (saf Java/küçük kütüphane) |
Kritik nokta: Spring Boot, Spring'in yerine geçmez; onu kolaylaştırır. Boot'u seçmek Spring'in gücünden vazgeçmek değildir.
Kontrol kaybı korkusu: yersiz
Yeni başlayanların en büyük endişesi: "Boot her şeyi otomatik yaparsa kontrolü kaybeder miyim?" Hayır. Spring Boot fikir sahibidir (opinionated) ama dayatmacı değildir:
- Bir bean tanımlamazsan Boot makul bir varsayılan sağlar.
- Sen kendi bean'ini tanımlarsan seninki kazanır — auto-config
@ConditionalOnMissingBeanile geri çekilir. - İstemediğin bir auto-config'i
@SpringBootApplication(exclude = ...)ile kapatabilirsin. - Her ayarı
application.ymlveya@Beanile değiştirebilirsin.
Örnek 1 (./Ornek1.java) bunu gösterir: kendi SelamlamaStratejisi bean'ini tanımlarız ve
Boot'un varsayılanı değil bizimki kullanılır. Yani Boot'a geçmek, Spring kontrolünü kaybetmek
değildir.
Düz Spring'den Spring Boot'a geçiş
Var olan bir Spring projesini Boot'a taşımak kademeli yapılabilir:
- Bağımlılıkları starter'lara çevir: Tek tek Spring bağımlılıkları yerine
spring-boot-starter-*kullan; sürüm yönetimini Boot BOM'una bırak. - Bir
@SpringBootApplicationgiriş noktası ekle:main+SpringApplication.run(...). - Manuel yapılandırmayı azalt: Elle yazdığın
DataSource,JdbcTemplate,EntityManager,DispatcherServletgibi bean'leri sil; Boot bunları otomatik kurar. Yalnızca gerçekten özel olanları@Beanolarak bırak. - XML'i Java config'e taşı:
application.yml+@Configurationkullan. - Gömülü sunucuya geç: Harici Tomcat/WAR yerine gömülü sunucu +
java -jar(executable jar). - Üretim araçlarını ekle: Actuator, profiller, dışsal yapılandırma.
- Adım adım doğrula: Her aşamada testleri çalıştır; davranış değişikliklerini yakala.
Tipik kazanım: yüzlerce satır yapılandırma kodu ve XML, birkaç satır +
application.yml'e iner. Bağımlılık sürüm çatışmaları büyük ölçüde ortadan kalkar.
Özet: bir bütünün iki yüzü
Bu eğitim boyunca önce Spring çekirdeğini (IoC/DI, AOP, veri, transaction, validation), sonra Spring Boot'u (auto-config, REST, JPA, güvenlik, üretim, test) öğrendik. Bu son bölümde ikisini karşılaştırdık ve gördük ki:
- Spring, kurumsal Java'nın sağlam temelidir; her şeyi yapabilirsin ama her şeyi sen kurarsın.
- Spring Boot, bu temelin üzerine "akıllı varsayılanlar" koyar; hızlı, üretime hazır ve hâlâ tümüyle özelleştirilebilir.
Doğru zihniyet: "Spring'i öğren, Spring Boot ile uygula." Boot'un sihrini anlamak, aslında altındaki Spring'i anlamaktır — ki bu eğitimde tam olarak onu yaptık.
Tebrikler: Java'dan Spring'e, Spring Boot'tan üretim ve teste kadar uçtan uca bir yolculuğu tamamladın. 🎉
▶ Kod Örnekleri(1)
Ornek1
ortam gerekir1// Ornek1: Boot kullanırken bile TAM kontrol sende — varsayılanı geçersiz kılmak.
2// Boot otomatik bir bean sağlar; ama sen kendi bean'ini tanımlarsan Boot GERİ ÇEKİLİR
3// (@ConditionalOnMissingBean). Yani Boot esnekliği elinden almaz.
4// Çalıştırma: portal derleyip gömülü ortamla başlatır.
5package com.egitim.karsilastirma.gecis;
6
7import org.springframework.boot.CommandLineRunner;
8import org.springframework.boot.WebApplicationType;
9import org.springframework.boot.autoconfigure.SpringBootApplication;
10import org.springframework.boot.builder.SpringApplicationBuilder;
11import org.springframework.context.annotation.Bean;
12
13public class Ornek1 {
14
15 public static void main(String[] args) {
16 new SpringApplicationBuilder(Ornek1.class).web(WebApplicationType.NONE).run(args);
17 }
18
19 interface SelamlamaStratejisi { String selamla(String ad); }
20
21 // KENDİ bean'imizi tanımlıyoruz. Eğer bir auto-configuration aynı tipte bir bean
22 // sağlıyor olsaydı, @ConditionalOnMissingBean sayesinde GERİ ÇEKİLİR, bizimki kullanılırdı.
23 @Bean
24 SelamlamaStratejisi selamlama() {
25 return ad -> "Merhaba " + ad + "! (ÖZEL strateji — Boot'un varsayılanı değil)";
26 }
27
28 @Bean
29 CommandLineRunner selfTest(SelamlamaStratejisi strateji) {
30 return args -> {
31 System.out.println("\n================ KONTROL SENDE ================");
32 System.out.println(strateji.selamla("Ada"));
33 System.out.println("""
34
35 --- Önemli ilke ---
36 Spring Boot 'fikir sahibidir' (opinionated) ama 'dayatmacı' değildir:
37 - Bir bean tanımlamazsan Boot makul bir varsayılan sağlar.
38 - Tanımlarsan SENİNKİ kazanır (auto-config @ConditionalOnMissingBean ile geri çekilir).
39 - İstemediğin auto-config'i @SpringBootApplication(exclude=...) ile kapatabilirsin.
40 - Her ayarı application.yml / @Bean ile değiştirebilirsin.
41 Yani Boot'a geçmek, Spring'in kontrolünü KAYBETMEK değildir; sadece varsayılanlar hazır gelir.""");
42 };
43 }
44}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.