Haruskah saya menggunakan @EJB atau @Inject

148

Saya telah menemukan pertanyaan ini: Apa perbedaan antara @Inject dan @EJB tapi saya tidak mendapatkan lebih bijaksana. Saya belum pernah melakukan Java EE sebelumnya atau saya tidak punya pengalaman dengan injeksi ketergantungan jadi saya tidak mengerti apa yang harus saya gunakan?

Apakah @EJB cara lama menyuntikkan? Apakah injeksi dilakukan oleh wadah EJB saat menggunakan anotasi ini saat menggunakan @Inject menggunakan kerangka kerja CDI baru? Apakah itu bedanya dan apakah saya harus menggunakan @Inject daripada @EJB jika ini masalahnya?

Luke yang beruntung
sumber

Jawaban:

178

Ini @EJBdigunakan untuk menyuntikkan hanya EJB dan tersedia untuk beberapa waktu sekarang. @Injectdapat menyuntikkan kacang yang dikelola dan merupakan bagian dari spesifikasi CDI baru (sejak Java EE 6).

Dalam kasus sederhana Anda dapat mengubah @EJBke @Inject. Dalam kasus yang lebih maju (misalnya ketika Anda sangat bergantung pada @EJBatribut seperti beanName, lookupatau beanInterface) daripada untuk menggunakan @InjectAnda perlu mendefinisikan @Producerbidang atau metode.

Sumber daya ini mungkin membantu untuk memahami perbedaan antara @EJBdan @Producesdan bagaimana cara mendapatkan yang terbaik dari mereka:

Blog Antonio Goncalves:
CDI Bagian I
CDI Bagian II
CDI Bagian III

Dokumentasi JBoss Weld:
CDI dan ekosistem Java EE

StackOverflow:
Suntikkan kacang @EJB berdasarkan kondisi

Piotr Nowicki
sumber
4
mengapa bisa @EJBdigunakan untuk injeksi sirkular (satu kacang tunggal dan satu kacang lainnya membutuhkan referensi satu sama lain)? (dengan mengacu pada jawaban saya di bawah ini - saya tidak yakin apakah saya melakukan hal yang benar dengan beralih ke @EJB)
necromancer
2
karena Anda tidak menyuntikkan implementasi, tetapi proxy yang menempatkan pada implementasi. karena ini, Anda mendapatkan keuntungan dari "ikatan mengikat" dan fitur wadah lainnya.
dia
33

@Injectbisa menyuntikkan kacang apa pun, sementara @EJBhanya bisa menyuntikkan EJB. Anda dapat menggunakan salah satu untuk menyuntikkan EJB, tapi saya lebih suka di @Injectmana-mana.

Bozho
sumber
1
Apa sebenarnya yang membuat injeksi ketika kita menggunakan @Inject? Wadah JavaEE? Bisakah itu menyuntikkan POJO?
Koray Tugay
3
dengan CDI itu adalah wadah CDI (dibundel dalam wadah JavaEE)
Bozho
16

Pembaruan: Jawaban ini mungkin salah atau kedaluwarsa. Silakan lihat komentar untuk detailnya.

Saya beralih dari @Injectke @EJBkarena @EJBmemungkinkan injeksi melingkar sedangkan @Injectmuntah di atasnya.

Detail: Saya perlu @PostConstructmemanggil suatu @Asynchronousmetode tetapi akan melakukannya secara serempak. Satu-satunya cara untuk membuat panggilan asinkron adalah dengan memanggil metode asli kacang lain dan meminta metode kembali kacang asli. Untuk melakukan ini, setiap kacang memerlukan referensi yang lain - sehingga melingkar. @Injectgagal untuk tugas ini saat @EJBberfungsi.

ahli nujum
sumber
@ MartijnBurger Saya tidak memiliki kode praktis, atau lingkungan Java EE berguna. Hanya membuat 2 kelas Java dan @Injectmereka menjadi bidang publik masing-masing. Jika itu berhasil maka jawaban saya salah. Jika itu tidak berhasil, maka jawaban saya sejauh ini benar. Selanjutnya ubah @Injectke @EJB(dan mungkin membubuhi keterangan kelas sendiri? Saya lupa.). Maka injeksi mutual siklik harus bekerja dengan baik. Itu sebabnya saya beralih dari @Injectke @EJB. Semoga ini masuk akal.
ahli nujum
Saya membuat dua pojo dan menyuntikkan pojo satu sama lain. Bekerja tanpa masalah di konfigurasi saya (WildFly 8.2 = CDI 1.2)
Martijn Burger
1
Terima kasih @MartijnBurger, saya akan mengonfirmasi itu, dan sementara itu menambahkan catatan hati-hati untuk jawaban saya.
ahli nujum
Tidak yakin apa yang ingin Anda capai, tetapi ini mungkin melakukan apa yang Anda inginkan dan tanpa ketergantungan melingkar. tomee.apache.org/examples-trunk/async-postconstruct/README.html . Juga kejadian CDI asinkron bisa menjadi cara yang lebih bersih untuk pergi (tergantung pada persyaratan).
JanM
12

Berikut ini adalah diskusi yang bagus tentang topik tersebut. Gavin King merekomendasikan @Inject over @EJB untuk EJB yang bukan remote.

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

atau

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

Re: Menyuntikkan dengan @EJB atau @Inject?

  1. Nov 2009, 20:48 America / New_York | Tautkan Gavin King

Kesalahan itu sangat aneh, karena referensi lokal EJB harus selalu serial. Bug di glassfish, mungkin?

Pada dasarnya, @Inject selalu lebih baik, karena:

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

Saya merekomendasikan untuk tidak menggunakan @EJB kecuali untuk mendeklarasikan referensi ke EJB jauh.

dan

Re: Menyuntikkan dengan @EJB atau @Inject?

  1. Nov 2009, 17:42 America / New_York | Tautkan Gavin King

    Apakah ini berarti @EJB lebih baik dengan EJB jarak jauh?

Untuk EJB jarak jauh, kami tidak dapat mendeklarasikan metadata seperti kualifikasi, @Alternative, dll, pada kelas bean, karena klien tidak akan memiliki akses ke metadata itu. Selain itu, beberapa metadata tambahan harus ditentukan bahwa kita tidak perlu untuk kasus lokal (nama JNDI global apa pun). Jadi semua hal itu harus pergi ke tempat lain: yaitu deklarasi @Produces.

John Manko
sumber
1
Meskipun ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi. Dengan begitu jawaban ini akan sangat berharga bahkan sekarang saat tautannya mati.
Mifeet
4

Mungkin juga berguna untuk memahami perbedaan dalam hal Session Bean Identity ketika menggunakan @EJB dan @Inject. Menurut spesifikasi, kode berikut akan selalu true:

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

Menggunakan @Inject alih-alih @EJB tidak ada yang sama.

lihat juga kacang sesi identitas stateless untuk info lebih lanjut

ken
sumber
0

Injeksi sudah ada di Java EE 5 dengan penjelasan @Resource, @PersistentUnit atau @EJB, misalnya. Tapi itu terbatas pada sumber daya tertentu (sumber data, EJB ...) dan ke dalam komponen tertentu (Servlets, EJBs, JSF backing bean ...). Dengan CDI, Anda dapat menyuntikkan hampir semua hal di mana saja berkat anotasi @Inject.

javier Zanetti
sumber