@EJB veya @Inject kullanmalı mıyım


150

Şu soruyu buldum: @Inject ve @EJB arasındaki fark nedir ama ben daha akıllı olamadım . Daha önce Java EE yapmadım veya bağımlılık enjeksiyonu konusunda deneyimim yok, bu yüzden ne kullanmam gerektiğini anlamıyorum?

@EJB eski bir enjeksiyon yöntemi mi? Enjeksiyon, yeni CDI çerçevesini kullanırken bu ek açıklamayı kullanırken EJB kapsayıcısı tarafından mı yapılır? Aradaki fark bu mu ve bu durumda @EJB yerine @Inject kullanmalı mıyım?

Yanıtlar:


181

@EJBEJB tek enjekte etmekte kullanılan ve şimdi oldukça zaman kullanılabilir edilir. @Injectyönetilen herhangi bir fasulyeyi enjekte edebilir ve yeni CDI spesifikasyonunun bir parçasıdır (Java EE 6'dan beri).

Basit durumlarda sadece değiştirebilir @EJBiçin @Inject. Daha gelişmiş durumlarda (örneğin ,, veya @EJBgibi 'nin özelliklerine bağlı olduğunuzda ) kullanmak için bir alan veya yöntem tanımlamanız gerekir .beanNamelookupbeanInterface@Inject@Producer

Bu kaynaklar, aralarındaki farkları @EJBve @Producesbunlardan en iyi şekilde nasıl yararlanılacağını anlamaya yardımcı olabilir :

Antonio Goncalves'in blogu:
CDI Part I
CDI Part II
CDI Part III

JBoss Weld belgeleri:
CDI ve Java EE ekosistemi

StackOverflow:
Koşullara göre @EJB bean enjekte edin


4
neden @EJBdairesel enjeksiyon için işe yarıyor (bir tek fasulye ve diğer bir çekirdek birbirine referansa ihtiyaç duyuyor)? (aşağıdaki cevabıma referansla - geçiş yaparak doğru şeyi yapıp yapmadığımdan emin değilim @EJB)
necromancer

2
çünkü uygulamayı enjekte etmiyorsunuz, ancak uygulamaya müdahale eden bir proxy. bu nedenle "geç bağlama" ve diğer konteyner özelliklerinin avantajlarını elde edersiniz.
ona

33

@Injectherhangi bir fasulyeyi enjekte @EJBedebilirken sadece EJB'leri enjekte edebilir. EJB'leri enjekte etmek için ikisini de kullanabilirsiniz, ancak ben @Injecther yeri tercih ederim .


2
@Inject kullandığımızda enjeksiyonu tam olarak yapan nedir? JavaEE kapsayıcısı? POJO'ları enjekte edebilir mi?
Koray Tugay

3
CDI ile bu CDI kapsayıcısıdır (JavaEE kapsayıcısında paketlenmiştir)
Bozho

16

Güncelleme: Bu cevap yanlış veya eski olabilir. Ayrıntılar için lütfen yorumlara bakın.

Ben gelen açık @Injectiçin @EJBçünkü @EJBise dairesel enjeksiyon sağlar @Injectüzerinde kusmuk.

Ayrıntılar: @PostConstructBir @Asynchronousyöntemi çağırmam gerekiyordu ama bunu eşzamanlı olarak yapacaktı. Eşzamansız çağrıyı yapmanın tek yolu, orijinalin başka bir fasulyenin yöntemini çağırması ve orijinal fasulyenin yöntemini geri çağırmasını sağlamaktı. Bunu yapmak için her bir fasulyenin diğerine bir referansa ihtiyacı vardı - bu nedenle dairesel. @Injectbu görev için başarısız oldu, oysa @EJBçalıştı.


@MartijnBurger Elimde koda veya Java EE ortamına sahip değilim. Sadece 2 Java sınıfı ve @Injectbunları birbirlerinin genel alanlarında oluşturun. Bu işe yararsa cevabım yanlıştır. Bu işe yaramazsa, cevabım şu ana kadar doğrudur. Sonraki değişiklik @Injectiçin @EJB(ve muhtemelen sınıfların kendilerine açıklama? Unutuyorum.). Daha sonra döngüsel karşılıklı enjeksiyon iyi çalışmalıdır. Ben den açık yüzden @Injectetmek @EJB. Umarım bu mantıklıdır.
necromancer

İki pojo yarattım ve pojoları birbirine enjekte ettim. Yapılandırmamda sorunsuz çalışıyor (WildFly 8.2 = CDI 1.2)
Martijn Burger

1
Teşekkürler @MartijnBurger, bunu onaylayacağım ve bu arada cevabıma bir uyarı notu ekleyeceğim.
necromancer

Neye ulaşmak istediğinizden tam olarak emin değilim, ancak bu muhtemelen tam olarak istediğiniz şeyi ve döngüsel bir bağımlılık olmadan gerçekleştiriyor. tomee.apache.org/examples-trunk/async-postconstruct/README.html . Ayrıca eşzamansız CDI olayları daha temiz bir yol olabilir (gereksinimlere bağlı olarak).
Ocak

12

İşte konuyla ilgili güzel bir tartışma. Gavin King, uzak olmayan EJB'ler için @EJB yerine @ Enjeksiyonu önerir.

http://www.seamframework.org/107780.lace

veya

https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace

Re: @EJB veya @Inject ile enjekte etmek?

  1. Kas 2009, 20:48 America / New_York | Gavin King ile bağlantı kurun

Bu hata çok garip çünkü EJB yerel referansları her zaman serileştirilebilir olmalıdır. Cam balıkta böcek olabilir mi?

Temel olarak @Inject her zaman daha iyidir, çünkü:

it is more typesafe,
it supports @Alternatives, and
it is aware of the scope of the injected object.

Uzak EJB'lere referans bildirmek dışında @EJB kullanımına karşı tavsiye ederim.

ve

Re: @EJB veya @Inject ile enjekte etmek?

  1. Kas 2009, 17:42 America / New_York | Gavin King ile bağlantı kurun

    @EJB'nin uzak EJB'lerle daha iyi olduğu anlamına mı geliyor?

Uzak bir EJB için, bean sınıfında niteleyiciler, @Alternative, vb. Gibi meta verileri bildiremeyiz, çünkü istemci bu meta veriye erişemeyecektir. Ayrıca, yerel durum için ihtiyacımız olmayan bazı ek meta veriler de belirtilmelidir (küresel JNDI adı ne olursa olsun). Yani tüm bu şeylerin başka bir yere gitmesi gerekiyor: yani @Produces beyanı.


1
Bu teorik olarak soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak tercih edilebilir. Böylelikle, bağlantı kesildiğinde bile bu cevap değerli olacaktır.
Mifeet


4

@EJB ve @Inject kullanırken Session Bean Identity terimindeki farkı anlamak da faydalı olabilir. Spesifikasyonlara göre aşağıdaki kod her zaman olacaktır true:

@EJB Cart cart1;
@EJB Cart cart2;
… if (cart1.equals(cart2)) { // this test must return true ...}

@EJB yerine @ Enjekte kullanmak aynı şey değildir.

daha fazla bilgi için durum bilgisi olmayan oturum çekirdekleri kimliğine de bakın


0

Örneğin, Java EE 5'te @Resource, @PersistentUnit veya @EJB ek açıklamalarıyla enjeksiyon zaten mevcuttu. Ancak belirli kaynaklarla (veri kaynağı, EJB ...) ve belirli bileşenlerle (Servletler, EJB'ler, JSF destek çekirdeği ...) sınırlıydı. CDI ile @Inject notu sayesinde neredeyse her yere enjekte edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.