Auto-Configuration Mekanizması
Giriş
Spring Boot'un en güçlü özelliklerinden biri auto-configuration'dır. Classpath'teki kütüphaneleri analiz ederek uygun bean'leri otomatik oluşturur. Peki bu "sihir" nasıl çalışır? Bu derste auto-configuration mekanizmasını derinlemesine inceleyeceğiz.
Auto-Configuration Nasıl Çalışır?
Spring Boot başlatıldığında şu adımlar izlenir:
@EnableAutoConfigurationaktif edilirMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsdosyası okunur (Boot 3.x) veyaMETA-INF/spring.factories(Boot 2.x)Her auto-configuration sınıfı koşullu olarak değerlendirilir
Koşulları sağlayan sınıflar bean tanımlarını register eder
// Örnek: DataSourceAutoConfiguration (basitleştirilmiş)
@AutoConfiguration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceProperties properties) {
return DataSourceBuilder.create()
.url(properties.getUrl())
.username(properties.getUsername())
.password(properties.getPassword())
.build();
}
}@Conditional Annotation Ailesi
Auto-configuration'ın kalbi @Conditional annotation'larıdır:
| Annotation | Koşul |
|---|---|
@ConditionalOnClass | Belirtilen sınıf classpath'te varsa |
@ConditionalOnMissingClass | Belirtilen sınıf classpath'te yoksa |
@ConditionalOnBean | Belirtilen bean ApplicationContext'te varsa |
@ConditionalOnMissingBean | Belirtilen bean yoksa (kullanıcı tanımlamamışsa) |
@ConditionalOnProperty | Belirtilen property ayarlanmışsa |
@ConditionalOnResource | Belirtilen resource mevcutsa |
@ConditionalOnWebApplication | Web uygulamasıysa |
@ConditionalOnExpression | SpEL ifadesi true ise |
// Sadece "app.feature.enabled=true" ise bean oluştur
@Bean
@ConditionalOnProperty(name = "app.feature.enabled", havingValue = "true")
public FeatureService featureService() {
return new FeatureService();
}
// Sadece MongoDB classpath'te varsa
@Configuration
@ConditionalOnClass(MongoClient.class)
public class MongoAutoConfiguration { }Auto-Configuration Report
Hangi auto-configuration'ların çalıştığını ve hangilerinin atlandığını görmek için --debug flag'ini kullanın:
java -jar myapp.jar --debug
# veya
./mvnw spring-boot:run -Dspring-boot.run.arguments=--debug
# veya application.properties'e:
debug=trueRapor çıktısı:
============================
CONDITIONS EVALUATION REPORT
============================
Positive matches: (Çalışan auto-config'ler)
-----------------
DataSourceAutoConfiguration matched:
- @ConditionalOnClass found required classes 'javax.sql.DataSource'
Negative matches: (Çalışmayan auto-config'ler)
-----------------
MongoAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient'Auto-Configuration Hariç Tutma (Excluding)
Bazen Spring Boot'un otomatik konfigürasyonunu istemezsiniz:
// Yöntem 1: Annotation ile
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
SecurityAutoConfiguration.class
})
public class MyApplication { }
// Yöntem 2: Properties ile
spring.autoconfigure.exclude=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfigurationCustom Auto-Configuration Yazma
Kendi kütüphaneniz için auto-configuration yazabilirsiniz:
// 1. Auto-configuration sınıfı
@AutoConfiguration
@ConditionalOnClass(MyLibrary.class)
@EnableConfigurationProperties(MyLibraryProperties.class)
public class MyLibraryAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyLibraryClient myLibraryClient(MyLibraryProperties props) {
return new MyLibraryClient(props.getApiKey(), props.getBaseUrl());
}
}
// 2. Properties sınıfı
@ConfigurationProperties(prefix = "mylib")
public class MyLibraryProperties {
private String apiKey;
private String baseUrl = "https://api.mylib.com";
// getter/setter
}
// 3. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.mylib.autoconfigure.MyLibraryAutoConfigurationKullanıcı application.properties'e şunu eklediğinde bean otomatik oluşur:
mylib.api-key=abc123
mylib.base-url=https://custom.api.comAuto-Configuration Öncelik Sırası
Kullanıcının tanımladığı bean'ler her zaman önceliklidir (
@ConditionalOnMissingBeansayesinde)Auto-configuration bean'leri sadece kullanıcı tanımlamamışsa devreye girer
@AutoConfigureOrderve@AutoConfigureBefore/Afterile sıralama yapılabilir
// Kullanıcı kendi DataSource'unu tanımlarsa, auto-config devre dışı kalır
@Configuration
public class MyDataSourceConfig {
@Bean
public DataSource dataSource() {
// Kendi özel DataSource konfigürasyonum
return new HikariDataSource();
}
}Best Practices
İpucu: Auto-configuration'ın ne yaptığını anlamak için
--debugraporunu mutlaka bir kez inceleyin. "Sihir" dediğimiz şeyin arkasında düzenli bir koşul değerlendirme süreci vardır.
Uyarı: Auto-configuration sınıfları
@ComponentScanile taranmamalıdır. Onlar özelAutoConfiguration.importsdosyası üzerinden yüklenir.
Özet
Auto-configuration, Spring Boot'un "convention over configuration" felsefesinin motor gücüdür. @Conditional annotation'ları ile akıllı kararlar alır, @ConditionalOnMissingBean ile kullanıcının konfigürasyonuna her zaman saygı gösterir. Bu mekanizmayı anlamak, Spring Boot ile çalışırken karşılaştığınız sorunları hızlıca teşhis etmenizi sağlar.
AI Asistan
Sorularını yanıtlamaya hazır