Spring Boot @ConditionalOnExpression Nedir? Uygulama Örneği
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:
İ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.
Şimdi database olarak değiştirip istek atalım.
data.layer.type=database
Uygulama Örneğini İndir
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.
No Comment! Be the first one.