Java EE'de şu anda birden fazla bileşen modeli olduğu için şu anda biraz kafa karıştırıcı. Bunlar CDI , EJB3 ve JSF Yönetilen Fasulyelerdir .
CDI mahalledeki yeni çocuk. CDI fasulye özelliği dependency injection
, scoping
ve bir event bus
. CDI fasulyeleri, enjeksiyon ve kapsam belirleme açısından en esnektir. Olay veri yolu çok hafiftir ve en basit web uygulamaları için bile çok uygundur. Buna ek olarak, CDI ayrıca portable extensions
, satıcıların Java EE'ye tüm uygulamalarda (Glassfish, JBoss AS, Websphere, vb.) Kullanılabilen ekstra işlevsellik sağlaması için bir tür eklenti mekanizması olan çok gelişmiş bir özelliği de ortaya çıkarır. .
EJB3 çekirdekleri eski eski EJB2 bileşen modelinden * sonradan uyarlandı ve Java EE'de bir açıklama yoluyla yönetilen ilk çekirdeklerdi. EJB3 fasulye özelliği dependency injection
,declarative transactions
, declarative security
, pooling
, concurrency control
, asynchronous execution
ve remoting
.
EJB3 çekirdeklerinde bağımlılık enjeksiyonu, CDI çekirdeklerinde olduğu kadar esnek değildir ve EJB3 çekirdeklerinde kapsam belirleme kavramı yoktur. Ancak, EJB3 çekirdekleri işlemseldir ve varsayılan olarak havuzlanır ** , CDI'nın EJB3 alanında bırakmayı seçtiği çok kullanışlı iki şey. Bahsedilen diğer öğeler de CDI'da mevcut değildir. EJB3'ün kendi başına bir olay veri yolu yoktur, ancak mesajları dinlemek için özel bir fasulye türü vardır; mesaj odaklı fasulye. Bu, Java Mesajlaşma Sisteminden veya JCA kaynak bağdaştırıcısı olan başka herhangi bir sistemden mesaj almak için kullanılabilir. Basit olaylar için tam gelişmiş mesajlaşma kullanmak, CDI olay veri yolundan çok daha ağırdır ve EJB3, bir üretici API'sini değil, yalnızca bir dinleyiciyi tanımlar.
JSF Managed Beans , JSF'nin dahil edilmesinden bu yana Java EE'de mevcuttur. Onlar da öne çıkıyordependency injection
ve scoping
. JSF Managed Beans, bildirim temelli kapsam belirleme kavramını tanıttı. Başlangıçta kapsamlar oldukça sınırlıydı ve aynı Java EE sürümünde, EJB3 çekirdeklerinin ek açıklamalar aracılığıyla zaten bildirilebildiği durumda, JSF Yönetilen Fasulye'nin hala XML olarak bildirilmesi gerekiyordu. JSF Managed Beans'in mevcut sürümü de nihayet bir açıklama yoluyla bildirilir ve kapsamlar, bir görünüm kapsamı ve özel kapsamlar oluşturma becerisiyle genişletilir. Aynı sayfaya gelen istekler arasındaki verileri hatırlayan görünüm kapsamı, JSF Managed Beans'in benzersiz bir özelliğidir.
Görünüm kapsamı dışında, Java EE 6'da JSF Managed Beans için hala çok az şey var. CDI'daki eksik görünüm kapsamı talihsiz, çünkü aksi takdirde CDI, JSF Managed Beans'in sunduğu mükemmel bir süper set olurdu. Güncelleme : Java EE 7 / JSF 2.2'de CDI uyumlu @ViewScoped eklendi, bu da CDI'yı gerçekten mükemmel bir süper set haline getirdi. Güncelleme 2 : JSF2.3'te, JSF tarafından yönetilen çekirdekler, CDI tarafından yönetilen çekirdekler lehine kullanımdan kaldırılmıştır.
EJB3 ve CDI ile durum o kadar da net değil. EJB3 bileşen modeli ve API, CDI'nın sunmadığı birçok hizmet sunar, bu nedenle tipik olarak EJB3, CDI ile değiştirilemez. Öte yandan, CDI, EJB3 ile kombinasyon halinde kullanılabilir - örneğin, EJB'lere kapsam desteği eklemek.
Uzman grup üyesi ve CanDI adlı bir CDI uygulamasının uygulayıcısı Reza Rahman, sık sık EJB3 bileşen modeliyle ilişkili hizmetlerin bir dizi CDI ek açıklaması olarak güçlendirilebileceğini ima etti. Bu gerçekleşirse, Java EE'deki tüm yönetilen çekirdekler CDI çekirdekleri haline gelebilir. Bu, EJB3'ün kaybolduğu veya eski hale geldiği anlamına gelmez, sadece işlevselliğinin EJB'nin @ Stateless ve @EJB gibi kendi açıklamaları yerine CDI aracılığıyla açığa çıkarılacağı anlamına gelir.
Güncelleme
TomEE ve OpenEJB'den David Blevins, blogunda CDI ve EJB arasındaki farklılıkları ve benzerlikleri çok iyi açıklıyor: CDI, EJB'leri ne zaman kırmalı?
* Sadece sürüm numarasında bir artış olmasına rağmen, EJB3 çekirdekleri çoğunlukla tamamen farklı bir fasulye türüdür: basit bir tek açıklama uygulayarak "yönetilen fasulye" haline gelen basit bir pojo, EJB2'deki modele kıyasla ağır ve Her bir çekirdek için aşırı derecede ayrıntılı XML dağıtım tanımlayıcısı gerekliydi, buna ek olarak, çeşitli son derece ağır ve çoğunlukla anlamsız bileşen arabirimleri uygulamak için gerekli olan çekirdek gerekiyordu.
** Durum bilgisi olmayan oturum çekirdekleri tipik olarak havuzlanır, durum bilgisi olan oturum çekirdekleri tipik olarak değildir (ancak olabilirler). Her iki tür için de havuzlama bu nedenle isteğe bağlıdır ve EJB spesifikasyonu bunu her iki şekilde de zorunlu kılmaz.