Spring Boot Proje Anatomisi
Giriş
Bir Spring Boot projesi oluşturduğunuzda karşınıza çıkan dosyalar ne işe yarar? pom.xml neden bu kadar önemli? @SpringBootApplication arka planda ne yapar? Bu derste bir Spring Boot projesini katman katman inceleyeceğiz.
Proje Dizin Yapısı
demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ ├── DemoApplication.java # Ana giriş noktası
│ │ │ ├── controller/ # REST Controller'lar
│ │ │ ├── service/ # İş mantığı
│ │ │ ├── repository/ # Veri erişim
│ │ │ ├── model/ # Entity/DTO sınıfları
│ │ │ └── config/ # Konfigürasyon sınıfları
│ │ └── resources/
│ │ ├── application.properties # Uygulama konfigürasyonu
│ │ ├── application.yml # YAML alternatifi
│ │ ├── static/ # Statik dosyalar (CSS, JS)
│ │ └── templates/ # Thymeleaf şablonları
│ └── test/
│ └── java/
│ └── com/example/demo/
│ └── DemoApplicationTests.java # Test sınıfları
├── pom.xml # Maven konfigürasyonu
├── mvnw / mvnw.cmd # Maven Wrapper
└── .gitignorepom.xml Detaylı İnceleme
Parent POM
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<relativePath/>
</parent>Parent POM şunları sağlar:
Tüm Spring ve 3rd party kütüphanelerin versiyon yönetimi (BOM — Bill of Materials)
Java versiyon ayarı, encoding ayarı
Maven plugin konfigürasyonları
Resource filtering
Starter Dependencies
<dependencies>
<!-- Web uygulaması: Spring MVC + Embedded Tomcat + Jackson -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Test: JUnit 5 + Mockito + AssertJ + Spring Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>Spring Boot Maven Plugin
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>Bu plugin ile: mvn package → çalıştırılabilir fat JAR oluşturulur.
application.properties vs application.yml
İki format da desteklenir, işlevsel olarak eşdeğerdir:
# application.properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.jpa.hibernate.ddl-auto=update
logging.level.root=INFO# application.yml
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
jpa:
hibernate:
ddl-auto: update
logging:
level:
root: INFOTercih: YAML hiyerarşik yapısıyla daha okunabilirdir, ancak indent hataları sorun çıkarabilir. Ekibinizle bir standart belirleyin.
@SpringBootApplication Anatomisi
@SpringBootApplication // Aşağıdaki 3 annotation'ı birleştirir
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// Eşdeğeri:
@SpringBootConfiguration // @Configuration'ın özelleştirilmiş hali
@EnableAutoConfiguration // Classpath taraması ile otomatik bean konfigürasyonu
@ComponentScan // Bu paketin altındaki tüm @Component'leri tarar
public class DemoApplication { }@SpringBootConfiguration: Bu sınıfın bir konfigürasyon kaynağı olduğunu belirtir
@EnableAutoConfiguration: spring-boot-autoconfigure modülündeki tüm auto-config sınıflarını aktifleştirir
@ComponentScan: Aynı paketteki ve alt paketlerdeki
@Component,@Service,@Repository,@Controllersınıflarını tarar
main() Metodu
public static void main(String[] args) {
// SpringApplication.run() şunları yapar:
// 1. ApplicationContext oluşturur
// 2. Auto-configuration çalıştırır
// 3. Component scanning yapar
// 4. Embedded server başlatır
// 5. ApplicationRunner/CommandLineRunner bean'lerini çağırır
SpringApplication.run(DemoApplication.class, args);
}Banner Customization
Uygulama başlarken görünen ASCII art banner'ı özelleştirebilirsiniz:
# src/main/resources/banner.txt
=======================================
__ __ _____ _
| \/ |_ _ | _ |_ __ ___(_)
| |\/| | | | | | |_) | '__/ _ \ |
| | | | |_| | | __/| | | (_) | |
|_| |_|\__, | |_| |_| \___// |
|___/ |__/
:: Spring Boot :: ${spring-boot.version}
=======================================# Banner'ı kapatma
spring.main.banner-mode=offBest Practices
İpucu: Ana uygulama sınıfını (
@SpringBootApplication) root package'a koyun. Böylece@ComponentScantüm alt paketleri otomatik tarar.
Uyarı:
@SpringBootApplicationsınıfınıcom.example.demopaketine koyduysanız,com.example.otherpaketindeki bean'ler taranmaz. Farklı paketleri taramak için@ComponentScan(basePackages = {...})kullanın.
Özet
Spring Boot projesinin her dosyası bir amaca hizmet eder. pom.xml bağımlılık ve build yönetimini, application.properties/yml uygulama ayarlarını, @SpringBootApplication ise uygulamanın çalışma altyapısını belirler. Bu yapıyı iyi anlamak, karşılaşacağınız hataları hızlıca çözmenizi sağlar.
AI Asistan
Sorularını yanıtlamaya hazır