Arşivler

Spring Boot @ConditionalOnExpression Nedir? Uygulama Örneği

Spring Boot Dersleri @ConditionalOnExpression Uygulama Ornegi
Spring Boot Dersleri @ConditionalOnExpression Uygulama Ornegi

Spring Boot Dersleri‘ne devam ediyorum.

Bu yazıda @ConditionalOnExpression anotasyonunun ne olduğundan, hangi amaçla ve ne zaman kullanmamız gerektiğinden bahsedeceğim. Proje örneğini yazının sonundaki linkten erişebilirsiniz.

ConditionalOnExpression Nedir?

Uygulamalarımızı dinamik olarak kontrol ederek farklı davranmasını sağlayabiliriz. Bu farklı davranışlar sayesinde uygulamamızı, @ConditionalOnExpression anotasyonu kullanarak SpEL ifadesinin true olduğunda ilgili kod bloğunun ya da sınıfın çalışmasını sağlamaktadır.

ConditionalOnExpression Uygulama Örneği

Yapacağımız uygulama şu şekilde çalışacak:

Spring Boot ConditionalOnExpression
Spring Boot ConditionalOnExpression Uygulama Ornegi

İstemciden bir istek gelecek ve bu istek yapıldıktan sonra application.yaml dosyasına vereceğimiz bir tanımlama ile InMemoryService kullanarak mı yoksa DatabaseService kullanarak çalışacağına karar verecektir.

Bir DataLayerService arayüzü tanımlayalım ve burada kayıt işlemi olsun.

public interface DataLayerService {
    String save(Student student);
}Code language: Java (java)

Bu arayüzü implement eden iki adet servis tanımlayacağız. Bu servislerin ismi DatabaseServiceImpl ve InMemoryServiceImpl olacak.

public class DatabaseServiceImpl implements DataLayerService {
    @Override
    public String save(Student student) {
        return "Saved Student to Database " + student.id();
    }
}Code language: Java (java)
public class InMemoryServiceImpl implements DataLayerService {
    @Override
    public String save(Student student) {
        return "Saved Student to Inmemory " + student.id();
    }
}Code language: Java (java)

ConditionalOnExpression Konfigurasyonu

Şimdi ise ConditionalOnExpression kullanarak hangi servisimizin çalışması gerekeceğine karar verecek bir config sınıfı oluşturalım.

@Configuration
public class StudentServiceConfiguration {

    @Bean
    @ConditionalOnProperty(prefix = "data.layer", name = "type", havingValue = "inmemory")
    public DataLayerService inMemoryService(){
        return new InMemoryServiceImpl();
    }

    @Bean
    @ConditionalOnProperty(prefix = "data.layer", name = "type", havingValue = "database")
    public DataLayerService databaseService(){
        return new DatabaseServiceImpl();
    }
}
Code language: Java (java)

Burada kullandığımız anotasyon sayesinde dinamik bir karar vererek hangi sınıfın çalışması gerektiğine karar vermiş oluyoruz. prefix ve name alanları, properties dosyamızın içerisinde yazan bilgilere karşılık gelen değerleri temsil etmektedir. havingValue değeri ise karşılık gelen değerin true ya da false olmasına göre koşulu sağlayan bir attribute’dir.

Şimdi ise controller’ımızı oluşturalım.

@RestController("/")
public class StudentController {
    private final StudentService studentService;

    public StudentController(StudentService studentService) {
        this.studentService = studentService;
    }
    @GetMapping
    public String saveStudent(@RequestBody Student student){
        return studentService.saveStudent(student);
    }
}Code language: PHP (php)

application.properties dosyasına tanımlamamızı yapalım ve hangi servisten çalışacağına karar verelim.

data.layer.type=inmemory

Şimdi Postman’den bir istek atalım.

Spring Boot @ConditionalOnExpression Nedir? Uygulama Örneği

Şimdi database olarak değiştirip istek atalım.

data.layer.type=database
Spring Boot @ConditionalOnExpression Nedir? Uygulama Örneği

Uygulama Örneğini İndir

Projenin Kaynak Kodlarına Ulaş

Cevap olarak ise Burak çıktısını verecektir. Eğer bir mediaType belirtmezsek json olarak göndermemiz gerekmektedir. mediaType tanımı json olursa da yine json formatı kabul etmemiz gerekmektedir.


Önceki Ders: Spring Boot Content Negotiation XML – JSON Uygulama Örneği
Spring Boot Dersleri
Sonraki Ders: TestContainers ile Spring Boot & MongoDB Test İşlemleri