Spring Framework, @Autowired annotasyonuyla bağımlılıkları otomatik enjekte ederken bazen hangi bean’in enjekte edileceğine karar vermek zor olabilir. Özellikle aynı türden birden fazla bean olduğunda bu sorun ortaya çıkar. İşte bu tür durumlar için @Primary annotasyonu kullanılır.
@Primary annotasyonu, Spring’in otomatik enjeksiyon sırasında hangi bean’in tercih edileceğini belirtmek için kullanılır. Bir bean üzerine @Primary annotasyonu eklediğinizde, Spring bu bean’i aynı türden diğer bean’lere göre öncelikli olarak kabul eder.
Basit Bir Örnek
Aşağıda, aynı arayüzü uygulayan iki farklı sınıfımız olduğunu varsayalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public interface MessageService { void sendMessage(String message); } @Component public class EmailService implements MessageService { public void sendMessage(String message) { System.out.println("Email Gönderildi: " + message); } } @Component @Primary public class SmsService implements MessageService { public void sendMessage(String message) { System.out.println("SMS Gönderildi: " + message); } } |
Eğer bir MessageService bağımlılığı enjekte etmek istediğimizde, Spring otomatik olarak @Primary ile işaretlenmiş olan SmsService’i seçer:
1 2 3 4 5 6 7 8 9 10 11 12 |
@Service public class NotificationService { @Autowired private MessageService messageService; // SmsService enjekte edilir. public void notifyUser(String message) { messageService.sendMessage(message); } } |
@Qualifier ile @Primary Kullanımı
Eğer hem @Primary annotasyonunu hem de @Qualifier annotasyonunu birlikte kullanırsanız, @Qualifier’in belirttiği bean öncelik kazanır:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Service public class NotificationService { @Autowired @Qualifier("emailService") private MessageService messageService; // @Qualifier nedeniyle EmailService enjekte edilir. public void notifyUser(String message) { messageService.sendMessage(message); } } |
Yani @Primary annotasyonu, Spring’in otomatik bağımlılık enjeksiyonu sırasında hangi bean’in tercih edileceğini belirtmek için mükemmel bir yol sunar. Ancak, @Qualifier’in belirttiği bir bean varsa, @Primary’in üzerinde önceliği vardır.
Umarım “Spring Boot’da @Primary Annotasyonu” başlıklı yazım sizin için faydalı olmuştur.
Şu yazılar da ilginizi çekebilir.
Spring Boot’ta @Lazy Annotasyonu
Yeni bir yazımda görüşmek üzere.
Happy coding!