← Kursa Dön
📄 Text · 15 min

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:

  1. @EnableAutoConfiguration aktif edilir

  2. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dosyası okunur (Boot 3.x) veya META-INF/spring.factories (Boot 2.x)

  3. Her auto-configuration sınıfı koşullu olarak değerlendirilir

  4. 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:

AnnotationKoşul
@ConditionalOnClassBelirtilen sınıf classpath'te varsa
@ConditionalOnMissingClassBelirtilen sınıf classpath'te yoksa
@ConditionalOnBeanBelirtilen bean ApplicationContext'te varsa
@ConditionalOnMissingBeanBelirtilen bean yoksa (kullanıcı tanımlamamışsa)
@ConditionalOnPropertyBelirtilen property ayarlanmışsa
@ConditionalOnResourceBelirtilen resource mevcutsa
@ConditionalOnWebApplicationWeb uygulamasıysa
@ConditionalOnExpressionSpEL 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=true

Rapor çı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.SecurityAutoConfiguration

Custom 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.MyLibraryAutoConfiguration

Kullanıcı application.properties'e şunu eklediğinde bean otomatik oluşur:

mylib.api-key=abc123
mylib.base-url=https://custom.api.com

Auto-Configuration Öncelik Sırası

  1. Kullanıcının tanımladığı bean'ler her zaman önceliklidir (@ConditionalOnMissingBean sayesinde)

  2. Auto-configuration bean'leri sadece kullanıcı tanımlamamışsa devreye girer

  3. @AutoConfigureOrder ve @AutoConfigureBefore/After ile 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 --debug raporunu 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ı @ComponentScan ile taranmamalıdır. Onlar özel AutoConfiguration.imports dosyası ü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.