Primary ve Qualifier Anotasyonları

Metin Alnıaçık
1 min readMay 18, 2022

--

Spring Framework, aynı interface’den türeyen birden fazla service varsa bu durumda hangi service’i inject edeceğine karar veremez. Bu sorunu çözmek için iki tane anotasyon vardır. Bunların bazı benzerlikleri ve farklılıkları vardır.

Yukarıdaki kod, derleme zamanında aşağıdaki hatayı verir.

Could not autowire. There is more than one bean of ‘AService’ type.

Bu hata yukarıda da belirtmiş olduğum durumun bir örneği, AService interface’ine bağlı birden fazla implementation vardır. Spring Framework hangisini inject edileceğine karar verememiştir.

Bu sorunu iki şekilde çözebiliriz. Bunlardan birincisi AService instance variable olarak eklendiğinde hangi implementation’un seçileceğine ilgili implementation sınıfının üst kısmına @primary anotasyonu eklenir.

Diğer çözüm yoluysa, instance variable’ı inject ettiğimiz yerde qualifier ile hangi implementation’u seçeceğimizi belirtebiliriz.

Bu durumda aService instance variable AServiceImpl2 sınıfından oluşturulmuş bir nesne olacaktır.

Aralarındaki fark ise şudur. Eğer primary kullanırsanız, her zaman aynı implementation kullanılacaktır. Eğer qualifier kullanırsanız, bir sınıfta AServiceImpl1 kullanılırken farklı bir sınıfta AServiceImpl2 kullanılabilir.

Son olarak önemli durumlardan biri de her ikisi kullanıldığında ne olacağıdır. Örneğin: AServiceImpl1 sınıfında primary anotasyonu varken BServiceImpl sınıfında qualifier anotasyonuyla AServiceImpl2 sınıfı belirtilirse, Nesne AServiceImpl2 sınıfından oluşturulan nesneyle ilişkilendirilir. Son durum aşağıdaki gibidir.

Main metodunun bulunduğu sınıfta BServiceImpl sınıfı inject edildikten sonra info metodu çalıştırıldığında konsolda ..AServiceImpl2.. yazacaktır.

Örneğin tamamına github adresimden ulaşabilirsiniz.

İyi günler,
Bol kodlamalar :)

--

--