CDI – @Default ve @Inject Notasyonları
CDI (Context and Dependency Injection), Java EE ortamı için tasarlanmış komple ve hafif bir enjeksiyon teknolojisidir. CDI ile, özel konteyner nesneleri (EJB,EntityManager) , ilkel veri tipi elemanları, kendi yazdığınız Java sınıf/nesneleri, kolaylıkla yönetilebilir ve enjekte edilebilirdir.
CDI standardında yapılandırılmış her uygulamada, tanımlı her bir Java sınıfı, enjekte edilebilir bir CDI nesnesi olma adayıdır. Bu varsayılan davranışı, her bir Java sınıfı başına gizlice yerleştirilen @Default notasyonu sağlar.
Yukarıdaki UML diagramında, sözleşmesi Arac olan bir Araba sınıfı bulunmaktadır. hizSoyle() metodunda rastgele bir int değer üretilmekte ve calis() metodunda, Araba x hızında çalışıyor diye konsola çıktı yapılmaktadır. Buradaki x, rastgele üretilen sayıyı temsil eder.
@Default // Olmasada olur.
public class Araba implements Arac{
public String calis() {
return "Araba "+hizSoyle()+" km. hızında çalışıyor..";
}
public int hizSoyle(){
return ThreadLocalRandom.current().nextInt(20, 240) ;
}
}
Yukarıdaki Araba sınıfı, CDI ortamı aktifleştirilmiş bir uygulama içinde ise, Araba sınıfı CDI tarafından yönetilebilir bir nesne olmaya aday olur. Peki CDI’i aktifleştirmekten kasıt edilen nedir?
CDI ortamının aktifleşmesi için öncelikle gerekli bağımlılıkların CLASSPATH içinde yer alması gerekir. Eğer Glassfish gibi bir uygulama sunucusu kullanılıyorsa, uygulama sunucusunda zaten CDI kütüphaneleri varolduğundan, ekstra bir tanımlamaya gerek olmadan CDI kullanılabilir.
Fakat uygulamanız bir Java SE uygulaması veya Tomcat, Jetty gibi tüğ siklet konteynerlerde çalışıyorsa, bir CDI kütüphanesi mutlaka projeye eklenmelidir.
CDI teknolojisinin, referans kütüphanesi JBOSS Weld ürünüdür. Bu sebeple, JBOSS Weld bağımlılığı projeye aşağıdaki gibi eklenirse, CDI etkinleştirmenin ilk aşaması gerçekleşmiş olur.
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version>1.1.10.Final</version>
</dependency>
CDI ortamının aktifleştirilmesi için, standart gereği olarak beans.xml isimli içi boş bir CDI konfigürasyon dosyasının uygulama içerisinde mutlaka bulunması gerekmektedir. Bu dosya, Java SE uygulamaları için /META-INF/beans.xml ,, Java EE Web uygulamaları için ise /WEB-INF/beans.xml yolunda bulunmalıdır. Bu dosyanın bulunma zorunluluğu başlangıçta saçma gelebilir ama, beans.xml’ in yukarıda belirtilen dizinlerde var olması, CDI ortamının aktifleştirmesi için konteynere verilen bir izin olarak değerlendirilebilir.
Java EE Web uygulamalarında, CDI ortamının aktifleştirilmesi /WEB-INF dizininde beans.xml dosyasıyla karşılaşır karşılaşılmaz otomatik olarak başlatılır. Fakat bir Java SE uygulaması için bu böyle değildir, CDI konteynerin başlatılması geliştiricinin yapması gereken bir iştir. Aşağıdaki Galeri sınıfına dikkat kesildiğinde bu durum açık bir biçimde görülebilir.
@Default // Olmasada olur.
public class Galeri {
@Inject
private Arac arac;
public static void main(String[] args) {
Weld weld = new Weld();
WeldContainer konteyner = weld.initialize(); // CDI ortamı burada başlatılıyor..
Galeri galeri = konteyner.instance().select(Galeri.class).get();
String mesaj=galeri.arac.calis();
System.out.println("> "+mesaj);
}
}
Galeri sınıfında bulunan WeldContainer türünden nesne referansı, başlatılan konteyner ortamını temsil eden bir CDI nesnesine erişir ve bu noktadan sonra, WeldContainer nesnesi üzerinden CDI nesneleri erişilebilir ve enjeksiyon işlemleri yapılabilir haldedir.
Bu noktadan sonra konteyner örneği üzerinden, Galeri sınıfı türünden bir CDI nesnesi edinilerek kullanılmaktadır. Burada Galeri nesnesine, programatik bir erişim sağlanmaktadır. Java SE uygulamalarında başlangıç için programatik erişim gereklidir (Spring’deki gibi.), fakat, elde edilen Galeri CDI nesnesi üzerinden artık tüm ortamdaki CDI nesnelerine, notasyon bazlı enjeksiyon yöntemiyle de kolaylıkla erişilebilir. Örneğin [ private @Inject Arac arac; ] gibi.
Galeri sınıfı koşturulduğunda, aşağıdaki gibi bir çıktı bizleri bekler.
Kaynak kodlara https://github.com/rahmanusta/Weld-SE-1 adresinden erişebilirsiniz.
Tekrar görüşmek dileğiyle..
1 Comment