Pertanyaan Apa perbedaan antara @Inject dan @EJB


Saat ini saya sedang mempelajari model komponen Java EE 6 yang baru dan saya bingung dengan mekanisme injeksi ketergantungan terbaru. Jadi inilah pertanyaanku:

1) Apa perbedaan antara @Inject dan @EJB

2) Jika saya memiliki POJO sederhana yang berisi POJO lain (yang salah satunya adalah kode DAO), apa yang akan menjadi pilihan yang lebih baik: @Inject atau @EJB?

Bisakah saya mencampur @Inject dan @EJB?

Contohnya adalah:

  • ClassA mengimplementasikan InterfaceA dan memiliki sebuah instance dari ClassA_Adaptor

  • ClassA_Adaptor mengimplementasikan InterfaceAB dan memiliki instance dari ClassB

  • ClassB mengimplementasikan InterfaceB dan memiliki sebuah instance dari ClassB_Adaptor dan sebuah contoh DAO_ClassB

  • ClassB_Adaptor mengimplementasikan InterfaceB dan memiliki instance dari ClassC

  • ClassC mengimplementasikan InterfaceBC dan memiliki sebuah instance dari WebService_ClassC

  • DAO_ClassB akan menggunakan JPA 2.0 (@PersistenceContext)

Saya ingin menyuntikkan semuanya termasuk DAO dan WebService.

3) Apakah pendekatan yang buruk hanya menggunakan transaksional untuk operasi tertentu tetapi tidak untuk semua?

Sebagai contoh: Beberapa metode dalam DAO_ClassB adalah kueri biasa Anda, sedangkan metode lainnya adalah metode "tulis". Apakah buruk untuk tidak membungkus metode "BACA" dengan transaksi?

Untuk pemahaman saya, DAO_ClassB dapat dibungkus dengan transaksi menggunakan @EJB (menyuntikkan DAO_ClassB dan membuat semua metode transaksional). Bagaimana saya bisa mengendalikannya?

Maaf jika beberapa pertanyaan membingungkan karena saya hanya tahu potongan dan potongan model komponen baru Java EE 6.


32
2018-05-04 20:57


asal


Jawaban:


  1. @EJB hanya menyuntikkan EJB, tetapi @Inject dapat digunakan untuk menyuntikkan POJO daripada EJB. Namun, @Inject mengharuskan arsip Anda menjadi BDA (mengandung beans.xml untuk EE 6, atau secara implisit di EE 7). @Inject juga memiliki kemampuan tambahan CDI (cakupan, pencegat, dll.), Tetapi kemampuan tersebut menimbulkan biaya tambahan. Server aplikasi memiliki dukungan untuk menentukan binding @EJB sehingga deployer dapat memilih target EJB, tetapi @Inject hanya memungkinkan pengembang aplikasi untuk memilih target EJB (dan itu harus ada dalam aplikasi).

  2. Jika target bukan EJB, maka Anda tidak boleh menggunakan @EJB.

  3. Itu tergantung apakah Anda membuat beberapa pertanyaan yang saling terkait dan kemudian mencoba untuk membuat keputusan bisnis. Anda perlu memahami tingkat isolasi dan mempertimbangkannya, bahkan untuk operasi hanya-baca.


30
2018-05-09 03:58



Dari Adam Biens Weblog:

Anda dapat menggunakan kedua anotasi untuk menyuntikkan EJB. Mulai dengan @Inject dan jika Anda mengalami masalah, alihkan ke @EJB.

@Inject does not have any methods / attributes--it is just a plain annotation:


@Target(value = {ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface Inject {
}

Di sisi lain, anotasi @EJB memungkinkan Anda untuk memberikan informasi tambahan, yang mungkin berguna untuk merujuk EJB jarak jauh, atau EJB yang tidak dapat disuntikkan sederhana dalam gaya "Konvensi atas Konfigurasi":

@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface EJB {

    public String name() default "";

    public String beanName() default "";

    public Class beanInterface() default Object.class;

    public String mappedName() default "";
}

8
2018-05-06 11:11



  1. @Inject lebih umum daripada EJB dan merupakan bagian dari spesifikasi CDI. Jadi jika Anda ingin menggunakan @Inject, Anda perlu mengimplementasikannya di server Anda.

  2. Untuk POJO (bukan EJB), Anda harus menggunakan @Inject.


5
2018-05-09 05:22