Eğitim Portalı/Spring Boot/Application Properties ve Yapılandırma
Spring Boot03-spring-boot/14-application-properties-ve-configuration

Application Properties ve Yapılandırma

Bir uygulamanın davranışını koda gömmek yerine dışarıdan yapılandırmak, profesyonel geliştirmenin temelidir: veritabanı adresi, port, özellik bayrakları, dış servis anahtarları... Aynı kod farklı ortamlarda (geliştirm…

Application Properties ve Yapılandırma

Bir uygulamanın davranışını koda gömmek yerine dışarıdan yapılandırmak, profesyonel geliştirmenin temelidir: veritabanı adresi, port, özellik bayrakları, dış servis anahtarları... Aynı kod farklı ortamlarda (geliştirme/test/üretim) farklı ayarlarla çalışır. Spring Boot bunu application.properties/application.yml dosyaları ve güçlü bir bağlama mekanizmasıyla sağlar.

Not: Bu portal örnekleri tek dosya çalıştırır (gerçek application.properties yoktur). Bu yüzden değerleri SpringApplicationBuilder.properties(...) ile programatik veriyoruz; gerçek projede bunlar application.properties/yml dosyasından gelir. Davranış aynıdır.

Yapılandırma kaynakları

Spring Boot ayarları birçok kaynaktan, bir öncelik sırasıyla okur (üstteki alttakini ezer):

  1. Komut satırı argümanları (--server.port=9090)
  2. Ortam değişkenleri (SERVER_PORT=9090)
  3. application-{profil}.properties (profil-özel)
  4. application.properties / application.yml
  5. Koddaki varsayılanlar

application.properties (anahtar=değer) ve application.yml (hiyerarşik) en yaygınıdır:

uygulama.ad=Eğitim Portalı
uygulama.surum=2.1
uygulama.ozellikler=arama,kod-calistirma,tema
server.port=8080

İki bağlama yolu

@Value — tekil değer

Tek bir ayarı doğrudan bir alana enjekte eder (varsayılanla):

@Value("${mesaj.karsilama:merhaba}")   // 'karsilama' yoksa 'merhaba'
private String karsilama;

@ConfigurationProperties — tipli, gruplu bağlama (önerilen)

Bir önek (uygulama.*) altındaki tüm ayarları bir nesneye/record'a bağlar; tip dönüşümünü (string→int/boolean/List) otomatik yapar:

@ConfigurationProperties(prefix = "uygulama")
record UygulamaAyarlari(String ad, String surum, List<String> ozellikler, boolean bakim) {}

Örnek 1 (./Ornek1.java) her iki yolu gösterir: virgüllü string List<String>'e, "true" boolean'a otomatik dönüşür. @ConfigurationProperties, çok sayıda ilişkili ayar için tercih edilen yoldur (tipli, doğrulanabilir, IDE otomatik tamamlamalı).

Profiller (ortamlar)

Farklı ortamlar için farklı ayar dosyaları:

application.properties            # ortak
application-dev.properties        # geliştirme
application-prod.properties       # üretim

Aktif profil: --spring.profiles.active=prod (veya SPRING_PROFILES_ACTIVE=prod). @Profile("dev") ile bean'ler profile göre koşullu yüklenir. (Spring profilleri topic 02-spring/05'te de işlendi.)

İyi uygulamalar

  • Sırları koda/git'e gömme: Parolalar, API anahtarları ortam değişkeni veya secret yöneticisi (Vault, K8s Secrets) ile gelsin. application.properties'e yazma.
  • @ConfigurationProperties + doğrulama: Bean Validation anotasyonlarıyla (@NotNull, @Min) ayarları başlangıçta doğrula (@Validated).
  • YAML hiyerarşi: Çok seviyeli ayarlarda .yml daha okunaklıdır.
  • @ConfigurationProperties tercih et @Value yerine (gruplama, tip güvenliği, test kolaylığı).

Özet

Uygulamayı dışarıdan yapılandırmayı öğrendik: yapılandırma kaynakları ve öncelik sırası; tekil @Value ve tipli/gruplu @ConfigurationProperties bağlama (otomatik tip dönüşümüyle; Örnek 1); profillerle ortam-bazlı ayar ve sır yönetimi gibi iyi uygulamalar. Sırada, uygulama davranışını izlemenin temeli: logging.

Kod Örnekleri(1)

Ornek1

ortam gerekir
Ornek1.java
1// Ornek1: Yapılandırma — @ConfigurationProperties (tipli) ve @Value (tekil).
2// Portal'da application.properties yok; değerleri SpringApplicationBuilder ile programatik veriyoruz.
3// Çalıştırma: portal gömülü Tomcat ile başlatır, self-test çıktısını alır.
4package com.egitim.springboot.config;
5
6import org.springframework.beans.factory.annotation.Value;
7import org.springframework.boot.CommandLineRunner;
8import org.springframework.boot.autoconfigure.SpringBootApplication;
9import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
10import org.springframework.boot.builder.SpringApplicationBuilder;
11import org.springframework.boot.context.properties.ConfigurationProperties;
12import org.springframework.boot.context.properties.EnableConfigurationProperties;
13import org.springframework.context.annotation.Bean;
14
15import java.util.List;
16
17@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
18@EnableConfigurationProperties(UygulamaAyarlari.class)
19public class Ornek1 {
20
21    public static void main(String[] args) {
22        // application.properties YOKKEN değerleri programatik enjekte ediyoruz (gerçekte bu dosyadan gelir):
23        new SpringApplicationBuilder(Ornek1.class)
24                .properties(
25                        "uygulama.ad=Eğitim Portalı",
26                        "uygulama.surum=2.1",
27                        "uygulama.ozellikler=arama,kod-calistirma,tema",
28                        "uygulama.bakim=true",
29                        "mesaj.karsilama=Hoş geldiniz")
30                .run(args);
31    }
32
33    @Value("${mesaj.karsilama:merhaba}") // tekil değer + varsayılan ('karsilama' yoksa 'merhaba')
34    private String karsilama;
35
36    @Bean
37    CommandLineRunner selfTest(UygulamaAyarlari ayar) {
38        return args -> {
39            System.out.println("\n========= YAPILANDIRMA SELF-TEST =========");
40            System.out.println("@ConfigurationProperties (tipli bağlama):");
41            System.out.println("  ad        : " + ayar.ad());
42            System.out.println("  surum     : " + ayar.surum());
43            System.out.println("  ozellikler: " + ayar.ozellikler() + "  (virgüllü string -> List<String>)");
44            System.out.println("  bakim     : " + ayar.bakim() + "  (string -> boolean)");
45            System.out.println("@Value (tekil): karsilama = " + karsilama);
46            System.out.println("==========================================");
47        };
48    }
49}
50
51// Tipli yapılandırma: 'uygulama.*' anahtarları bu record'a OTOMATİK bağlanır (tip dönüşümüyle).
52@ConfigurationProperties(prefix = "uygulama")
53record UygulamaAyarlari(String ad, String surum, List<String> ozellikler, boolean bakim) {}
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.