EJB
Sudah mencoba mempelajari apa itu kacang, apa artinya contoh mereka dikelola di kolam, bla bla. Benar-benar tidak bisa menguasai mereka.
Bisakah Anda menjelaskan kepada saya apa itu sebenarnya (praktis untuk Programmer Java)? Apa yang mereka lakukan? Apa tujuan mereka? Mengapa benar-benar menggunakannya? (Kenapa tidak tetap berpegang pada POJO
?) Mungkin contoh aplikasi?
Silakan merujuk hanya ke informasi yang diperbarui, yaitu EJB 3.1
. Informasi tertanggal tentang EJB dapat menyesatkan.
Untuk pemula yang belajar EJB, harap diperhatikan:
EJB didasarkan pada objek terdistribusi , ini merujuk pada potongan perangkat lunak yang berjalan pada beberapa mesin (virtual atau fisik) yang ditautkan oleh jaringan .
jakarta-ee
ejb
ejb-3.1
jacktrades
sumber
sumber
Jawaban:
JIKA Anda membutuhkan komponen yang mengakses database, atau mengakses konektivitas lain / sumber daya direktori, atau diakses dari banyak klien, atau dimaksudkan sebagai layanan SOA, EJBs saat ini biasanya "lebih besar, lebih kuat, lebih cepat (atau setidaknya lebih skalabel) dan lebih sederhana "daripada POJO. Mereka paling berharga untuk melayani sejumlah besar pengguna melalui web atau jaringan perusahaan dan agak kurang bernilai untuk aplikasi kecil dalam suatu departemen.
Menggunakan kembali / Berbagi Logika di beberapa aplikasi / klien dengan Kopling Lepas.
EJB dapat dikemas dalam toples mereka sendiri, digunakan, dan dipanggil dari banyak tempat. Mereka adalah komponen umum. Benar, POJO dapat (hati-hati!) Dirancang sebagai perpustakaan dan dikemas sebagai botol. Tetapi EJB mendukung akses jaringan lokal dan jarak jauh - termasuk melalui antarmuka java lokal, RMI transparan, pesan async JMS dan layanan web SOAP / REST, menghemat dari dependensi cut-and-paste jar dengan beberapa penyebaran (tidak konsisten?).
Mereka sangat berguna untuk membuat layanan SOA. Ketika digunakan untuk akses lokal mereka adalah POJO (dengan layanan kontainer gratis ditambahkan). Tindakan merancang lapisan EJB terpisah mempromosikan perawatan ekstra untuk memaksimalkan enkapsulasi, penggabungan longgar dan kohesi, dan mempromosikan antarmuka yang bersih (Fasad), melindungi penelepon dari pemrosesan yang rumit & model data.
Skalabilitas dan Keandalan Jika Anda menerapkan sejumlah besar permintaan dari berbagai pesan / proses / utas panggilan, permintaan tersebut didistribusikan di seluruh mesin virtual EJB yang tersedia di kumpulan terlebih dahulu dan kemudian diantrekan. Ini berarti bahwa jika jumlah permintaan masuk per detik lebih besar dari yang dapat ditangani oleh server, kami menurunkan dengan anggun - selalu ada beberapa permintaan yang diproses secara efisien dan permintaan berlebih dibuat untuk menunggu. Kami tidak mencapai server "kehancuran" - di mana SEMUA permintaan mengalami waktu respons yang buruk secara bersamaan, ditambah server mencoba mengakses lebih banyak sumber daya daripada yang dapat ditangani oleh perangkat keras & OS & karenanya macet. EJB dapat digunakan pada tier terpisah yang dapat dikelompokkan - ini memberikan keandalan melalui failover dari satu server ke yang lain, ditambah perangkat keras dapat ditambahkan ke skala secara linear.
Manajemen Concurrency. Wadah memastikan bahwa mesin virtual EJB diakses secara aman (seri) oleh banyak klien. Kontainer mengelola kumpulan EJB, kumpulan thread, antrian doa, dan secara otomatis melakukan penguncian tulis tingkat metode (default) atau penguncian membaca (melalui @Lock (READ)). Ini melindungi data dari korupsi melalui bentrokan tulis-tulis bersamaan, dan membantu data dibaca secara konsisten dengan mencegah bentrokan baca-tulis.
Ini terutama berguna untuk kacang sesi @Singleton, di mana kacang memanipulasi dan berbagi keadaan umum di seluruh penelepon klien. Ini dapat dengan mudah dikuasai untuk secara manual mengkonfigurasi atau secara terprogram mengendalikan skenario lanjutan untuk eksekusi kode bersamaan dan akses data.
Penanganan transaksi otomatis.
Jangan lakukan apa-apa dan semua metode EJB Anda dijalankan dalam transaksi JTA. Jika Anda mengakses database menggunakan JPA atau JDBC itu secara otomatis terdaftar dalam transaksi. Sama untuk pemanggilan JMS dan JCA. Tentukan @TransactionAttribute (someTransactionMode) sebelum metode untuk menentukan jika / bagaimana metode tertentu mengambil bagian dalam transaksi JTA, menimpa mode default: "Diperlukan".
Akses sumber daya / ketergantungan yang sangat sederhana melalui injeksi.
Kontainer akan mencari sumber daya dan menetapkan referensi sumber sebagai bidang contoh di EJB: seperti koneksi JDBC yang disimpan JNDI, koneksi / topik / antrian JMS, EJB lainnya, Transaksi JTA, konteks kegigihan manajer entitas JPA, unit kegigihan entitas manajer pabrik JPA, unit persistensi pabrik entitas JPA, dan Sumber daya adaptor JCA. mis. untuk menyiapkan referensi ke EJB lain & Transaksi JTA & manajer entitas JPA & pabrik koneksi JMS dan antrian:
Servlet dapat memanggil kacang ini secara lokal, dengan hanya mendeklarasikan variabel instan:
dan kemudian hanya memanggil metode yang diinginkan.
Interaksi cerdas dengan JPA. Secara default, EntityManager yang disuntikkan seperti di atas menggunakan konteks persistensi cakupan transaksi. Ini sempurna untuk sesi kacang tanpa kewarganegaraan. Ketika metode EJB (stateless) dipanggil, konteks kegigihan baru dibuat dalam transaksi baru, semua instance objek entitas yang diambil / ditulis ke DB hanya terlihat dalam pemanggilan metode tersebut dan diisolasi dari metode lain. Tetapi jika EJB stateless lainnya dipanggil dengan metode ini, kontainer menyebarkan dan membagikan PC yang sama kepada mereka, sehingga entitas yang sama secara otomatis dibagi secara konsisten melalui PC dalam transaksi yang sama.
Jika bean sesi @Stateful dideklarasikan, afinitas smart yang sama dengan JPA dicapai dengan mendeklarasikan entitasManager sebagai lingkup yang diperluas: @PersistentContent (unitName = "AccountsPU, tipe = EXTENDED). Ini ada selama masa sesi bean, lintas beberapa panggilan kacang dan transaksi, caching salinan dalam-memori entitas DB yang sebelumnya diambil / ditulis sehingga mereka tidak perlu diambil kembali.
Manajemen Siklus Hidup. Siklus hidup EJB dikelola wadah. Seperti yang diperlukan, itu menciptakan instance EJB, membersihkan dan menginisialisasi state state sesi kacang, pasif & mengaktifkan, dan memanggil metode panggilan balik siklus hidup, sehingga kode EJB dapat berpartisipasi dalam operasi siklus untuk memperoleh dan melepaskan sumber daya, atau melakukan inisialisasi dan perilaku penutupan lainnya. Itu juga menangkap semua pengecualian, mencatatnya, memutar kembali transaksi sesuai kebutuhan, dan melempar pengecualian EJB baru atau @ApplicationExceptions sesuai kebutuhan.
Manajemen keamanan. Kontrol akses berbasis peran untuk EJBs dapat dikonfigurasi melalui anotasi sederhana atau pengaturan XML. Server secara otomatis meneruskan rincian pengguna yang diautentikasi bersama dengan setiap panggilan sebagai konteks keamanan (prinsip dan peran panggilan). Ini memastikan bahwa semua aturan RBAC ditegakkan secara otomatis sehingga metode tidak dapat secara ilegal dipanggil oleh peran yang salah. Hal ini memungkinkan EJB untuk dengan mudah mengakses detail peran / pengguna untuk pemeriksaan programatik tambahan. Ini memungkinkan penyumbatan dalam pemrosesan keamanan ekstra (atau bahkan alat IAM) ke wadah dengan cara standar.
Standardisasi & Portabilitas. Implementasi EJB sesuai dengan standar Java EE dan konvensi pengkodean, mempromosikan kualitas dan kemudahan pemahaman dan pemeliharaan. Ini juga mempromosikan portabilitas kode ke server aplikasi vendor baru, dengan memastikan semuanya mendukung fitur dan perilaku standar yang sama, dan dengan mencegah pengembang untuk secara tidak sengaja mengadopsi
fitur vendor non-portabel yang dipatenkan .
The Real Kicker: Kesederhanaan. Semua hal di atas dapat dilakukan dengan kode yang sangat ramping - baik menggunakan pengaturan default untuk EJB dalam Java EE 6, atau menambahkan beberapa anotasi. Pengkodean fitur perusahaan / kekuatan industri di POJO Anda sendiri akan jauh lebih banyak, kompleks dan rawan kesalahan. Setelah Anda mulai membuat kode dengan EJB, mereka agak mudah dikembangkan dan memberikan manfaat "perjalanan gratis" yang hebat.
Dalam spesifikasi EJB asli 10 tahun yang lalu, EJB adalah masalah produktivitas utama. Mereka bengkak, membutuhkan banyak kode dan artefak konfigurasi dan memberikan sekitar 2/3 dari manfaat di atas. Sebagian besar proyek web tidak menggunakannya. Tetapi ini telah berubah secara signifikan dengan 10 tahun penyesuaian, perbaikan, peningkatan fungsional dan pengembangan aliran arus. Di Java EE 6 mereka memberikan kekuatan industri tingkat maksimum dan kesederhanaan penggunaan.
Apa yang tidak disukai ?? :-) :-)
sumber
EJB adalah komponen Java, yang berisi logika bisnis, yang Anda gunakan dalam wadah, dan yang mendapat manfaat dari layanan teknis yang disediakan oleh wadah, biasanya dengan cara deklaratif, berkat anotasi:
sumber
Semoga ini dari Oracle doc akan membantu orang seperti saya untuk memahami topik EJB dengan cara yang sederhana.
sumber
Pertanyaan yang paling menarik minat saya adalah bagaimana dan di mana saya bisa menggunakannya. Untuk memahami hal ini, pertama-tama kita perlu melihat jenis-jenis EJB yang ada. Ada 2 kategori besar:
Mari kita pertimbangkan Session Beans. Ada 3 jenis:
OrderService
. Penggunaan besar lainnya adalah untuk mengekspos layanan web. Sekali lagi, ini berada di lapisan Layanan atau benar-benar terpisah.Configuration
komponen tersebut muncul di benak - di mana Anda dapat menyimpan konfigurasi level aplikasi dan mengaksesnya saat Anda membutuhkannya dari mana saja.Sekarang sisa kemampuan atau fitur dapat digunakan lintas lapisan dalam situasi seperti itu:
Salah satu penggunaan besar di zaman modern adalah apa yang disebut Microservices dan Arsitektur Berorientasi Layanan. Anda dapat mengemas beberapa komponen logika bisnis sebagai EJB dan mendistribusikannya di seluruh organisasi, untuk digunakan oleh banyak klien (oleh klien di sini maksud saya aplikasi back-end lainnya).
Dan seterusnya. Sekarang kelemahan terbesarnya adalah Anda menjadi sangat bergantung pada wadah EJB dan meskipun Anda dapat beralih di antara 2 implementasi referensi, Anda tidak akan dapat beralih ke sesuatu yang lebih ringan - Tomcat misalnya. Tetapi mengapa Anda ingin mengorbankan semua manfaatnya?
sumber