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.propertiesyoktur). Bu yüzden değerleriSpringApplicationBuilder.properties(...)ile programatik veriyoruz; gerçek projede bunlarapplication.properties/ymldosyası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):
- Komut satırı argümanları (
--server.port=9090) - Ortam değişkenleri (
SERVER_PORT=9090) application-{profil}.properties(profil-özel)application.properties/application.yml- 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
.ymldaha okunaklıdır. @ConfigurationPropertiestercih et@Valueyerine (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 gerekir1// 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) {}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.