CDI ve @Qualifier Karmaşası
@Qualifier notasyonlarının doğrudan enjeksiyon noktalarında kullanılamamalarından ötürü, projelerinizde @Qualifier özelliği katılmış seçici notasyonların, çok fazlalaştığı görülebilir.
Örneğin yukarıdaki gibi Arac arayüzü türünden Otobus, Traktor ve Araba sınıfları CDI projenizde bulunuyor olsun. Bu noktada, [@Inject Arac arac;]
Fakat her bir sınıf için harici bir @Qualifier eklenmiş notasyon sınıfı oluşturmak, kalabalıklık açısından karmaşa oluşturabilir. Özellikle uygulamaların daha da kompleks olduğu uygulamalarda bu durum bir keşmekeş oluşturabilir.
İşte bu noktada, CDI standardı bu keşmekeşi çözmek üzere, tek bir @Qualifier katılmış notasyon sınıf üzerinden, birden fazla seçim yapılabilmesi için Java enum sınıflarından faydalanır.
public enum Araclar { Araba, Otobus, Traktor }
Araclar enum sınıfı içerisinde Araba, Otobus ve Traktor isimli alanları sunmakta ve seçim işleminin elemanlarını tanımlamaktadır. Bu elemanlar gibi birden fazla veri alanı bu enum’a eklenebilir vaziyettedir.
@Target({ElementType.TYPE,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Qualifier // Seçici özellik katılıyor public @interface AracSecici { Araclar secBirini(); }
Yukarıdaki kod parçasında, Araclar enum sınıfını kullanmak üzere bir @AracSecici notasyonunun yapılandırıldığı görülebilir. Bu notasyonun elemanlarına bakıldığında, Araclar enum sınıfı türünden bir sevBirini() alanına sahip olduğu görülebilir. Bu noktada, secBirini() alanına atanan tür bilgisine göre, enjeksiyon noktasına enjekte edilecek kaynak sınıf seçilebilmektedir.
Örneğin Otobus sınıfından bir CDI nesnesinin, Galeri sınıfı içindeki enjeksiyon noktasına adanması isteniyorsa, Otobus ve Galeri sınıfları aşağıdaki gibi yapılandırılabilir.
@AracSecici(secBirini = Araclar.Otobus) public class Otobus implements Arac { public String calis() { return "Otobüs "+hizSoyle()+" km. hızında çalışıyor.."; } public int hizSoyle(){ return ThreadLocalRandom.current().nextInt(20, 190) ; } }
@AracSecici notasyonu üzerindeki secBirini alanına tanımlanan Araclar.Otobus atamasıyla, Otobus türünden CDI nesnesinin seçimi sağlanır.
public class Galeri { @Inject @AracSecici(secBirini = Araclar.Otobus) private Arac arac; public static void main(String[] args) { Weld weld = new Weld(); WeldContainer konteyner = weld.initialize(); Galeri galeri = konteyner.instance().select(Galeri.class).get(); String mesaj=galeri.arac.calis(); System.out.println("> "+mesaj); } }
Galeri sınıfı koşturulduğunda, Otobus CDI nesnesinin enjekte edildiği aşağıdaki çıktıdan anlaşılabilir.
Kayna kodlara https://github.com/rahmanusta/Weld-SE-3 adresinden erişebilirsiniz.
Tekrar görüşmek dileğiyle.
Tag:cdi, enum, quailifier, qualifier
1 Comment