Spring Boot

Yol Haritası#

  1. Spring Boot ve AutoConfiguration nedir nasıl çalışır ?
  2. Spring main() methodu çalıştırıldığında Spring otomatik olarak nasıl tomcat sunucusu ayağa kaldırır ?
  3. Spring properties dosyası nedir ne işe yarar ?

@Conditional Anotasyonu#

  • Bu anotasyonunun konumuzla hiç ilgisi yok gibi görünebilir ama Spring Boot bu anotasyonu sonuna kadar sağlıyor işte bu yüzden de yukarda saydığımız özellikleri bize sunabiliyor.
  1. Diyelim ki bir yazılım şirketiniz var ve bu şirkette birkaç tane projeyi aynı andan geliştirmektesiniz.
  2. TÜm projeleri good old spring core ile geliştiryorsunuz. Düz Spring Framework yani.
  3. Ardından bir yazılımcınız gelip dedi ki : Bir konfigürasyon classınız / projeniz var ve bunu tüm projeler kullanmakta. Bu classsı / projeyi shared bir proje olarak dışarı alalım. Ardın da diğer projelerimize bunun jar’ınız koyalım. Herkes rahat rahat kullansın.
@Configuration
public class MyCompanySharedContextConfiguration {

    @Bean
    public MyCompanyDataSource dataSource() {
        return new MyCompanyDataSource();
    }

    @Bean
    ...........
	...........
    ...........
}
  1. Diyelim ki bu shared proje bir DB operasyonu içeriyor. Haliyle bu projeyi implement eden diğer projeler de DB operasyonu ile ilgili işler yaptı ya da yapacak.
  2. Peki ya yepyeni bir proje daha geldi ve bu projenin DB operasyonu yapmasına gerek yok ama shared projedeki diğer implemenyasyonları kullanması gerekiyor.
  • İşte bu noktada @Conditional anotasyonu devreye giriyor.

Bu anotasyon sayesinde siz Spring’e runtime zamanında hangi @Bean’lerin context’e girip girmeyeceğine karar verebiliyorsunuz.

Gelin aşağıdaki örnekle bu olayı pekiştirelim.

@Configuration
public class MyCompanySharedContextConfiguration {

    @Bean
    @Conditional(IsRelationalDatabaseCondition.class)
    public MyCompanyDataSource dataSource() {
        return new MyCompanyDataSource();
    }

    @Bean
    ...........
	...........
    ...........
}
  • IsRelationalDatabaseCondition ->
package com.atacankullabci;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class IsRelationalDatabaseCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {  // (1)
        return oracleJdbcDriverOnClassPath() && databaseUrlSet(context); // (2)
    }

    private boolean databaseUrlSet(ConditionContext context) { // (3)
        return context.getEnvironment().containsProperty("spring.datasource.url");
    }

    private boolean oracleJdbcDriverOnClassPath() { // (4)
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            return true;
        } catch (ClassNotFoundException e) {
            return false;
        }
    }
}
  1. Condition class’ı bir interface ve implement edilmesini istediği “matches” adında bir true / false dönen bir methodu var. Yani bu bean için kullanılacak koşul sağlandı mı sağlanmadı mı ? Spring bu Bean'i context'e koysun mu koymasın mı ?

  2. Burada iki adet durum kontrol edilmekte. Birincisi java’nın classpath’inde Oracle driver’ı varmı ? İkinicisi .properties dosyasında herhangi bir dbye ait bir connection url mevcut mu?.

  3. Spring’in context i içine koyulmuş bir datasource ul var mı yok mu kontrolü.

  4. Eğer mevcut java classpath’inde Class.forName("") methoduna sağlanan class var ise bu uygulama bu dependency’lere sahip demektir.

Peki bunların Spring Boot ile ne alakası var ?#

Spring Boot aslında @Conditional annotasyonu ile dolu bir shared proje.

Örneğin, properties dosyasına bir connection url koyduğunuz taktir de Spring Boot içinde DataSource için uygun olan bir @Condiional methodu aktive oluyor ve Spring sizin için bir DataSource oluşturuyor. Ya da uygulamanızı çalıştırınca gömülü bir Tomcat Sunucusu ayağa kalkıyor çünkü Tomcat kütüphaneleri sizin classpath’inizde mevcut?

Atacan KULLABCI © 2024