Pada artikel ini kita akan melihat EJB - Enterprise JavaBeans. Teknologi ini merupakan bagian dari spesifikasi Java EE. Kami akan menyentuh isu-isu seperti:
- apa itu EJB;
- bagaimana sejarah EJB;
- jenis EJB apa yang ada?
Sejarah Singkat EJB
Pada tahun 1996, ketika penulis artikel ini berusia 5 tahun, Java sudah populer di kalangan developer. Alasannya adalah API yang ramah, pengumpulan sampah otomatis, dll. Java banyak digunakan dalam sistem yang bertanggung jawab atas backend. Namun, terlepas dari semua keindahan bahasanya, pemrogram pada masa itu membutuhkan fungsionalitas tertentu yang belum diimplementasikan di JDK. Kebutuhan tersebut adalah:- memastikan persistensi data;
- integritas transaksi
- akses kompetitif terhadap data (kontrol multi-threading);
- dan kemungkinan besar sesuatu yang lain.
Apa itu EJB
EJB dalam arti tertentu adalah istilah kolektif yang, tergantung pada konteksnya, dapat berarti teknologi Enterprise JavaBeans itu sendiri secara umum, atau komponen perangkat lunak (bean) Enterprise JavaBean tertentu yang merupakan bagian dari teknologi EJB. Definisi EJB sebagai suatu teknologi diberikan di Wikipedia: Enterprise JavaBeans (juga sering digunakan sebagai singkatan EJB) adalah spesifikasi teknologi untuk menulis dan mendukung komponen server yang berisi logika bisnis. Ini adalah bagian dari Java EE. Teknologi ini biasanya digunakan ketika logika bisnis memerlukan setidaknya satu dari layanan berikut, dan sering kali semuanya:- dukungan untuk persistensi data: data harus aman bahkan setelah program dihentikan. Paling sering dicapai dengan menggunakan database;
- dukungan untuk transaksi terdistribusi;
- dukungan untuk modifikasi data paralel dan multithreading;
- dukungan acara;
- dukungan penamaan dan direktori (JNDI);
- keamanan dan pembatasan akses terhadap data;
- dukungan untuk instalasi otomatis pada server aplikasi;
- akses jarak jauh.
tipe EJB
Mari kita rangkum. EJB adalah kelas Java reguler yang ditandai dengan salah satu anotasi khusus. Kelas seperti ini disebut kacang. Bergantung pada anotasi yang digunakan untuk menandai kelas, kelas tersebut akan mewakili satu atau beberapa jenis EJB (kacang). Ada tiga jenis utama kacang:- Kacang yang Didorong Pesan (pesan yang digerakkan oleh kacang);
- Entity Beans - didefinisikan dalam spesifikasi JPA (Java Persistence API) dan digunakan untuk menyimpan data;
- Kacang Sesi.
- stateless (tanpa negara);
- stateful (dengan dukungan untuk status sesi saat ini);
- singleton (satu objek untuk seluruh aplikasi; mulai dari EJB 3.1).
Kacang Sesi
Session Beans, atau session beans, adalah jenis kacang tertentu. Mereka merangkum logika bisnis yang dapat dipanggil secara terprogram oleh klien dengan memanggil metode kacang. Pemanggilan metode dapat melakukan:- secara lokal, oleh kelas lain di JVM yang sama dengan kacang sesi;
- dari jarak jauh, melalui jaringan, dari JVM lain, menggunakan teknologi Java RMI (Remote Method Invocation).
@Stateless
. Mari kita beri contoh di bawah ini:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Kacang sesi yang mendukung status sesi saat ini (Stateful) menyimpan informasi tentang statusnya di antara panggilan dari klien yang sama dan mengakhiri keberadaannya atas permintaan eksplisit dari klien. Hal ini dicapai karena fakta bahwa stateful beans bersifat unik untuk setiap klien. Contoh tugas yang menjadi tanggung jawab kacang jenis ini adalah menjaga keranjang belanja di toko online tetap mutakhir untuk setiap pengguna. Siklus hidup biji kopi ini dikelola oleh wadah EJB. Kacang ini juga hancur ketika klien keluar. Kacang seperti itu juga cukup mudah dibuat. Ini adalah kelas Java yang ditandai dengan anotasi Stateful
. Contoh di bawah ini:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
Kacang sesi tunggal dimulai satu kali selama masa pakai aplikasi dan berlangsung sepanjang masa pakai aplikasi. Kacang tersebut dirancang untuk situasi di mana satu keadaan harus dibagi di antara semua klien. Seperti halnya kacang yang tidak memiliki kewarganegaraan, dalam kacang yang berdiri sendiri, pengembang perlu memastikan bahwa lingkungan di dalam kacang tersebut diatur dengan cara yang aman bagi thread. Mari kita beri contoh kacang Singleton, yang pembuatannya semudah kacang sejenisnya, yang telah dibahas di atas. Sangat mudah untuk menebak bahwa ini adalah kelas Java dengan anotasi @Singleton
. Namun, dalam hal ini Anda perlu berhati-hati. Ada dua anotasi, identik dalam sintaksis, tetapi berbeda tujuannya dan terletak di paket berbeda:
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
. Contoh di bawah ini:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
Kacang yang Didorong Pesan
Kacang yang Didorong Pesan, atau MDB, atau kacang yang digerakkan oleh pesan, menerapkan beberapa logika bisnis, seperti kacang sesi. Namun tidak seperti saudaranya, MDB memiliki satu perbedaan penting. Klien tidak pernah memanggil metode MDB secara langsung. Kacang seperti itu paling sering bertindak sebagai pendengar pesan JMS (Java Message Service) dan berfungsi untuk mengatur pertukaran pesan asinkron antar bagian sistem. Contoh dari pesan tersebut adalah permintaan pengiriman inventaris dari sistem ritel otomatis ke sistem manajemen pasokan. Di bawah ini adalah contoh kacang MDB. Berbeda dengan session beans, pembuatannya sedikit lebih menarik:import javax.annotation.Resource;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(mappedName = "jms/TestQueue")
public class MessageDrivenEjbExample implements MessageListener {
@Resource
private MessageDrivenContext messageDrivenContext;
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage msg = (TextMessage) message;
msg.getText();
}
} catch (JMSException e) {
messageDrivenContext.setRollbackOnly();
}
}
}
Anotasi tersebut MessageDriven
menjadikan kelas MDB kami menarik. Di dalam anotasi, menggunakan JNDI (baca tentang JNDI di sini ), nama distribusi JMS ditentukan, di mana kelas kita menjadi pendengarnya. Selain itu, kelas kami mengimplementasikan antarmuka MessageListener
dan metodenya onMessage
. Metode ini akan dipanggil ketika beberapa pesan masuk dari antrian/distribusi dengan nama yang ditentukan di dalam anotasi MessageDriven
.
Kacang entitas
Bagian dari teknologi EJB adalah spesifikasi JPA. JPA, atau Java Persistence API, adalah spesifikasi yang menyediakan Pemetaan Relasional Objek (ORM) objek Java (Entity beans) dan menyediakan API untuk menyimpan, mengambil, dan mengelola objek tersebut. JPA memungkinkan Anda untuk merepresentasikan data dari database sebagai objek Java, serta menyimpan objek Java sebagai catatan dalam database. Tidak setiap kelas dapat bertindak sebagai objek seperti itu, tetapi kacang Entitas. Entity Bean adalah kelas Java yang mewakili tabel dalam database. Tampilan (pemetaan) dicapai melalui penggunaan anotasi khusus. Dengan bantuan mereka, kelas Java dibandingkan dengan tabel di database, dan bidang kelas Java dibandingkan dengan bidang tabel database. Berikut ini contoh kacang Entitas, dengan komentar di kodenya:@Entity // Делает данный класс Entity бином
@Table(name = "employee") // "Связывает" данный класс с таблицей employee в БД
public class Employee implements Serializable {
@Id // Говорит о том, что поле ниже является первичным ключом
@GeneratedValue(strategy = GenerationType.AUTO) // Определяет тип генерации значений первичного ключа
private int id;
@Column(name="name") // "Связывает" поле ниже с полем name в таблице employee в БД
private String name;
@Column (name="age") // "Связывает" поле ниже с полем age в таблице employee в БД
private int age;
// getters and setters...
}
Perlu dicatat bahwa jenis kacang ini masuk akal untuk dipelajari hanya dalam konteks mempelajari spesifikasi JPA.
Menulis aplikasi: EJB HelloWorld
Di bagian ini, kita akan menulis aplikasi kecil Java EE HelloWorld, yang akan kita terapkan di server GlassFish. Sebelum membaca artikel ini, sangat disarankan agar Anda membaca artikel tentang menyiapkan lingkungan lokal Anda .-
Buat proyek Maven baru di IntelliJ IDEA.
File -> Baru -> Proyek...
-
Klik Berikutnya .
-
Isi parameter proyek Maven:
-
Klik Selesai
-
Proyek telah dibuat dan memiliki struktur sebagai berikut:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javarush.lectures</groupId>
<artifactId>ejb_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
</project>
Selanjutnya, Anda dapat melanjutkan ke kode Java. Aplikasi kami akan menjadi yang paling sederhana. Kami akan memiliki 1 servlet dan 1 EJB. Ini akan menjadi sesi tanpa kewarganegaraan. Di dalam EJB kita hanya akan mendefinisikan 1 metode yang akan mengembalikan string “Hello World”. Pertama-tama, mari kita buat sebuah paket com.javarush.lectures
. Kemudian, di dalam paket com.javarush.lectures
, kita akan membuat kacang kita - DemoEJB. Kode kacang diberikan di bawah ini:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
Seperti disebutkan sebelumnya, semuanya cukup sederhana. Langkah kita selanjutnya adalah membuat servlet yang akan meneruskan nilai dari EJB sebagai respons terhadap permintaan HTTP. Perlu dicatat bahwa servlet bukanlah topik artikel ini, tetapi Anda masih perlu menggunakannya untuk mendemonstrasikan EJB. Untuk melakukan ini, mari buat servlet baru DemoServlet
dalam paket yang sama dengan EJB. Kodenya ada di bawah:
@WebServlet("/helloWorld")
public class DemoServlet extends HttpServlet {
@EJB
private DemoEJB ejb;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write(ejb.helloWorld());
}
}
Berikut beberapa komentar singkat tentang kode tersebut. Abstrak @WebServlet("/helloWorld")
- mendefinisikan kelas kita sebagai servlet yang akan memproses permintaan HTTP ke titik akhir /helloWorld
. Kelas kami memiliki satu bidang - DemoEJB ejb
. Ini adalah kacang yang kami definisikan sebelumnya. Anotasi pada bidang kelas— @EJB
melakukan injeksi ketergantungan (DI). Itu. Variabel ejb secara otomatis diinisialisasi dengan instance baru bila diperlukan. Kelas kami adalah turunan dari HttpServlet dan mengesampingkan salah satu metode superkelas - doGet
. Metode ini memproses permintaan HTTP GET dan mengambil dua parameter - HttpServletRequest
dan HttpServletResponse
. HttpServletRequest
berfungsi untuk mendapatkan informasi tentang permintaan HTTP yang masuk. HttpServletResponse
diperlukan untuk menghasilkan respons terhadap permintaan. Di dalam metode ini, kita mendapatkan objek PrintWriter
dari objek respons ( HttpServletResponse
), menggunakan metode getWriter()
. Selanjutnya, kita bisa menulis beberapa nilai ke objek yang dihasilkan menggunakan write
. Yang sebenarnya adalah apa yang kita gunakan dengan menulis ke dalam PrintWriter
objek -a nilai yang diperoleh dari EJB yang kita definisikan (nilainya adalah string “Hello World!”). Klien yang mengirimkan permintaan HTTP akan menerima nilai ini sebagai respons terhadap permintaannya. Langkah selanjutnya adalah meluncurkan aplikasi di server GlassFish Java EE. Untuk melakukan ini, kami akan membuat konfigurasi baru, seperti yang dijelaskan dalam artikel tentang menyiapkan lingkungan lokal . Di bawah ini adalah tangkapan layar konfigurasi yang telah selesai untuk proyek saat ini. Pastikan Anda telah menginstal server GlassFish sebelum memulai: Setelah membuat konfigurasi peluncuran, luncurkan aplikasi menggunakan menu Run -> Run 'ejb_demo' atau menggunakan hotkey Shift+F10 . Setelah diluncurkan, Anda dapat melihat lognya: Dan juga browser yang terbuka: Semua ini menunjukkan bahwa aplikasi berfungsi sebagaimana mestinya.
Kesimpulan
Pada artikel ini kita berkenalan dengan EJB - Enterprise JavaBeans. Kami mempertimbangkan pertanyaan-pertanyaan seperti:- Apa itu EJB?
- Sejarah EJB
- Berbagai jenis EJB
- Kacang yang Didorong Pesan (pesan yang digerakkan oleh kacang);
- Entity Beans - ditentukan dalam spesifikasi entitas JPA (Java Persistence API) dan digunakan untuk menyimpan data;
- Kacang Sesi:
- stateless (tanpa negara)
- stateful (dengan dukungan untuk status sesi saat ini)
- singleton (satu objek untuk seluruh aplikasi; mulai dari EJB 3.1)
GO TO FULL VERSION