Spring Framework, bağımlılıklarınızı otomatik olarak enjekte etmenizi sağlar. Fakat bazen, birden fazla bean türünün mevcut olması durumunda, Spring hangi bean’in enjekte edileceğini belirlemekte zorlanır. İşte bu noktada @Qualifier annotasyonu devreye girer.
@Autowired annotasyonu kullanıldığında Spring, bağımlılığı otomatik olarak enjekte eder. Ancak birden fazla aday bean olduğunda, hangi bean’in kullanılması gerektiğini belirtmemiz gerekiyor. İşte @Qualifier annotasyonu bu seçimi yapmamızı kolaylaştırır.
Örneğin, aşağıdaki gibi bir durumu düşünelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public interface MessageService { void sendMessage(String message); } @Component("emailService") public class EmailService implements MessageService { public void sendMessage(String message) { System.out.println("Email Gönderildi: " + message); } } @Component("smsService") public class SmsService implements MessageService { public void sendMessage(String message) { System.out.println("SMS Gönderildi: " + message); } } |
Şimdi bu servislerden birini @Autowired ile enjekte etmek istediğimizde, hangi servisi kullanacağımızı belirtmemiz gerekecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Service public class NotificationService { private final MessageService messageService; @Autowired public NotificationService(@Qualifier("emailService") MessageService messageService) { this.messageService = messageService; } public void notifyUser(String message) { messageService.sendMessage(message); } } |
Yukarıdaki örnekte, @Qualifier(“emailService”) ile EmailService bean’ini enjekte ediyoruz. Eğer “smsService” olarak değiştirseydik, SmsService bean’ini enjekte ederdik.
Field Enjeksiyonunda @Qualifier
Sadece constructor bazlı enjeksiyon için değil, field bazlı enjeksiyon için de @Qualifier kullanabiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Service public class NotificationService { @Autowired @Qualifier("emailService") private MessageService messageService; public void notifyUser(String message) { messageService.sendMessage(message); } } |
@Qualifier ile Birden Fazla Bağımlılığın Enjekte Edilmesi
Birden fazla bağımlılığı aynı anda enjekte etmek için de @Qualifier kullanabilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@Service public class NotificationService { private final MessageService emailService; private final MessageService smsService; @Autowired public NotificationService(@Qualifier("emailService") MessageService emailService, @Qualifier("smsService") MessageService smsService) { this.emailService = emailService; this.smsService = smsService; } public void notifyByEmail(String message) { emailService.sendMessage(message); } public void notifyBySms(String message) { smsService.sendMessage(message); } } |
Spring Boot’da, @Qualifier annotasyonu sayesinde birden fazla bean arasında seçim yaparak bağımlılıklarımızı daha kontrollü bir şekilde enjekte edebiliriz. Bu özellik, büyük projelerde veya birden fazla benzer bean’in olduğu durumlarda oldukça kullanışlıdır.
Umarım “Spring Boot’da @Qualifier Annotasyonu” başlıklı yazım sizin için faydalı olmuştur.
Şu yazılar da ilginizi çekebilir.
Spring Boot’da @Primary Annotasyonu
Yeni bir yazımda görüşmek üzere.
Happy coding!