Dalam artikel ini kita akan melihat EJB - Enterprise JavaBeans. Teknologi ini adalah sebahagian daripada spesifikasi Java EE. Kami akan menyentuh isu seperti:
- apa itu EJB;
- apakah sejarah EJB;
- apakah jenis EJB yang ada?
Sejarah Ringkas EJB
Pada tahun 1996, ketika pengarang artikel ini berumur 5 tahun, Java sudah popular di kalangan pembangun. Sebabnya ialah API yang mesra, kutipan sampah automatik, dsb. Java digunakan secara meluas dalam sistem yang bertanggungjawab untuk bahagian belakang. Walau bagaimanapun, di sebalik semua keseronokan bahasa itu, pengaturcara pada masa itu memerlukan fungsi tertentu yang belum dilaksanakan dalam JDK. Keperluan ini ialah:- memastikan kegigihan data;
- integriti transaksi
- akses kompetitif kepada data (kawalan berbilang benang);
- dan kemungkinan besar sesuatu yang lain.
Apa itu EJB
EJB dalam erti kata lain ialah istilah kolektif yang, bergantung pada konteks, boleh bermaksud sama ada teknologi Enterprise JavaBeans itu sendiri secara umum, atau beberapa komponen perisian JavaBean Enterprise tertentu (kacang) yang merupakan sebahagian daripada teknologi EJB. Takrifan EJB sebagai teknologi diberikan di Wikipedia: Enterprise JavaBeans (juga sering digunakan sebagai singkatan EJB) ialah spesifikasi teknologi untuk menulis dan menyokong komponen pelayan yang mengandungi logik perniagaan. Ia adalah sebahagian daripada Java EE. Teknologi ini biasanya digunakan apabila logik perniagaan memerlukan sekurang-kurangnya satu daripada perkhidmatan berikut, dan selalunya kesemuanya:- sokongan untuk kegigihan data: data harus selamat walaupun selepas menghentikan program. Paling kerap dicapai menggunakan pangkalan data;
- sokongan untuk transaksi yang diedarkan;
- sokongan untuk pengubahsuaian data selari dan multithreading;
- sokongan acara;
- sokongan penamaan dan direktori (JNDI);
- keselamatan dan sekatan akses kepada data;
- sokongan untuk pemasangan automatik pada pelayan aplikasi;
- akses jauh.
jenis EJB
Mari kita ringkaskan. EJB ialah kelas Java biasa yang ditandakan dengan salah satu anotasi khas. Kelas sedemikian dipanggil kacang. Bergantung pada anotasi kelas yang ditandakan, ia akan menjadi wakil satu atau satu lagi jenis EJB (kacang). Terdapat tiga jenis utama kacang:- Kacang Message Driven (kacang yang dipandu mesej);
- Kacang Entiti - ditakrifkan dalam spesifikasi JPA (Java Persistence API) dan digunakan untuk menyimpan data;
- Kacang Sesi.
- tanpa negara (tanpa negara);
- stateful (dengan sokongan untuk keadaan sesi semasa);
- singleton (satu objek untuk keseluruhan aplikasi; bermula dari EJB 3.1).
Kacang Sesi
Kacang Sesi, atau kacang sesi, adalah jenis kacang tertentu. Mereka merangkum logik perniagaan yang pelanggan boleh menggunakan pemrograman dengan memanggil kaedah kacang. Panggilan kaedah boleh dilakukan:- secara tempatan, oleh kelas lain dalam JVM yang sama dengan kacang sesi;
- dari jauh, melalui rangkaian, dari JVM lain, menggunakan teknologi Java RMI (Remote Method Invocation).
@Stateless
. Mari kita berikan contoh di bawah:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Biji sesi yang menyokong keadaan sesi semasa (Stateful) mengekalkan maklumat tentang keadaan mereka antara panggilan kepadanya daripada pelanggan yang sama dan menamatkan kewujudannya atas permintaan eksplisit daripada pelanggan. Ini dicapai kerana fakta bahawa kacang stateful adalah unik untuk setiap pelanggan. Contoh tugas yang boleh dipertanggungjawabkan oleh kacang jenis ini ialah memastikan troli beli-belah di kedai dalam talian dikemas kini untuk setiap pengguna. Kitaran hayat kacang ini diuruskan oleh bekas EJB. Kacang ini juga musnah apabila pelanggan keluar. Kacang sedemikian juga agak mudah dibuat. Ini ialah kelas Java yang ditandakan dengan anotasi Stateful
. Contoh di bawah:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
Kacang sesi singleton dimulakan sekali sepanjang hayat permohonan dan wujud sepanjang hayat permohonan. Kacang sedemikian direka untuk situasi di mana satu keadaan mesti dikongsi di kalangan semua pelanggan. Seperti kacang tanpa negara, dalam kacang kendiri pembangun perlu memastikan bahawa persekitaran di dalam kacang diatur dengan cara yang selamat dari benang. Mari kita berikan contoh kacang Singleton, yang semudah dibuat sebagai rakan sejawatannya, yang telah dibincangkan di atas. Sangat mudah untuk meneka bahawa ini adalah kelas Java dengan anotasi @Singleton
. Walau bagaimanapun, dalam kes ini anda perlu berhati-hati. Terdapat dua anotasi, sama dalam sintaks, tetapi berbeza dalam tujuan dan terletak dalam pakej yang berbeza:
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
. Contoh di bawah:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
Kacang Message Driven
Kacang Didorong Mesej, atau MDB, atau kacang dipacu mesej, melaksanakan beberapa logik perniagaan, seperti kacang sesi. Tetapi tidak seperti saudara-maranya, MDB mempunyai satu perbezaan penting. Pelanggan tidak pernah menghubungi kaedah MDB secara langsung. Kacang sedemikian paling kerap bertindak sebagai pendengar untuk mesej JMS (Java Message Service) dan berfungsi untuk mengatur pertukaran mesej tak segerak antara bahagian sistem. Contoh mesej sedemikian ialah permintaan untuk penghantaran inventori daripada sistem runcit automatik kepada sistem pengurusan bekalan. Di bawah adalah contoh kacang MDB. Tidak seperti kacang sesi, penciptaannya 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 MessageDriven
menjadikan kelas MDB kami sebagai kacang. Di dalam anotasi, menggunakan JNDI (baca tentang JNDI di sini ), nama pengedaran JMS ditentukan, yang mana kelas kami menjadi pendengar. Di samping itu, kelas kami melaksanakan antara muka MessageListener
dan kaedahnya onMessage
. Kaedah ini akan dipanggil apabila beberapa mesej tiba dari baris gilir/pengedaran dengan nama yang ditakrifkan di dalam anotasi MessageDriven
.
Kacang entiti
Sebahagian daripada teknologi EJB ialah spesifikasi JPA. JPA, atau Java Persistence API, ialah spesifikasi yang menyediakan Pemetaan Perhubungan Objek (ORM) objek Java (kacang Entiti) dan menyediakan API untuk menyimpan, mendapatkan semula dan mengurus objek tersebut. JPA membolehkan anda mewakili data daripada pangkalan data sebagai objek Java, serta menyimpan objek Java sebagai rekod dalam pangkalan data. Tidak setiap kelas boleh bertindak sebagai objek sedemikian, tetapi kacang Entiti. Entity Bean ialah kelas Java yang mewakili jadual dalam pangkalan data. Paparan (pemetaan) dicapai melalui penggunaan anotasi khas. Dengan bantuan mereka, kelas Java dibandingkan dengan jadual dalam pangkalan data, serta medan kelas Java dibandingkan dengan medan jadual pangkalan data. Berikut ialah contoh kacang Entiti, dengan ulasan dalam kod:@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 diingat bahawa jenis kacang ini masuk akal untuk dikaji hanya dalam konteks mengkaji spesifikasi JPA.
Menulis permohonan: EJB HelloWorld
Dalam bahagian ini, kami akan menulis aplikasi Java EE HelloWorld kecil, yang akan kami gunakan pada pelayan GlassFish. Sebelum membaca artikel ini, amat disyorkan anda membaca artikel tentang menyediakan persekitaran setempat anda .-
Cipta projek Maven baharu dalam IntelliJ IDEA.
Fail -> Baharu -> Projek...
-
Klik Seterusnya .
-
Isikan parameter projek Maven:
-
Klik Selesai
-
Projek ini telah dibuat dan mempunyai struktur 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>
Seterusnya, anda boleh beralih ke kod Java. Permohonan kami akan menjadi yang paling mudah. Kami akan mempunyai 1 servlet dan 1 EJB. Ini akan menjadi kacang sesi tanpa negara. Di dalam EJB kami akan menentukan hanya 1 kaedah yang akan mengembalikan rentetan "Hello World". Pertama sekali, mari kita buat pakej com.javarush.lectures
. Kemudian, di dalam pakej com.javarush.lectures
, kami akan mencipta kacang kami - DemoEJB. Kod kacang diberikan di bawah:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
Seperti yang dikatakan sebelum ini, semuanya agak mudah. Langkah seterusnya kami ialah mencipta servlet yang akan menghantar nilai dari EJB sebagai tindak balas kepada permintaan HTTP. Perlu diingat bahawa servlet bukan topik artikel ini, tetapi anda masih perlu menggunakannya untuk menunjukkan EJB. Untuk melakukan ini, mari kita cipta servlet baharu DemoServlet
dalam pakej yang sama dengan EJB. Kodnya adalah 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 adalah beberapa ulasan ringkas tentang kod tersebut. Abstrak @WebServlet("/helloWorld")
- mentakrifkan kelas kami sebagai servlet yang akan memproses permintaan HTTP ke titik akhir /helloWorld
. Kelas kami ada satu bidang - DemoEJB ejb
. Ini adalah kacang kami yang ditakrifkan sebelum ini. Anotasi pada medan kelas— @EJB
melaksanakan suntikan kebergantungan (DI). Itu. Pembolehubah ejb dimulakan secara automatik dengan kejadian baharu apabila diperlukan. Kelas kami adalah keturunan HttpServlet dan mengatasi salah satu kaedah superclass - doGet
. Kaedah ini memproses permintaan HTTP GET dan mengambil dua parameter - HttpServletRequest
dan HttpServletResponse
. HttpServletRequest
berfungsi untuk mendapatkan maklumat tentang permintaan HTTP yang masuk. HttpServletResponse
diperlukan untuk menghasilkan respons kepada permintaan. Di dalam kaedah, kita mendapat objek PrintWriter
daripada objek tindak balas ( HttpServletResponse
), menggunakan getWriter()
. Seterusnya, kita boleh menulis beberapa nilai pada objek yang dihasilkan menggunakan write
. Yang, sebenarnya, adalah apa yang kami gunakan dengan menulis ke dalam PrintWriter
objek -a nilai yang diperoleh daripada EJB yang kami takrifkan (nilainya ialah rentetan "Hello World!"). Pelanggan yang menghantar permintaan HTTP akan menerima nilai ini sebagai respons kepada permintaannya. Langkah seterusnya ialah melancarkan aplikasi pada pelayan GlassFish Java EE. Untuk melakukan ini, kami akan membuat konfigurasi baharu, seperti yang diterangkan dalam artikel tentang menyediakan persekitaran setempat . Di bawah ialah tangkapan skrin konfigurasi siap untuk projek semasa. Pastikan anda memasang pelayan GlassFish sebelum memulakan: Selepas membuat konfigurasi pelancaran, lancarkan aplikasi menggunakan menu Run -> Run 'ejb_demo' atau menggunakan kekunci pintas Shift+F10 . Selepas pelancaran, anda boleh melihat lognya: Dan juga penyemak imbas yang dibuka: Semua ini menunjukkan bahawa aplikasi berfungsi seperti yang dimaksudkan.
Kesimpulan
Dalam artikel ini kami berkenalan dengan EJB - Enterprise JavaBeans. Kami mempertimbangkan soalan seperti:- Apa itu EJB?
- Sejarah EJB
- Pelbagai jenis EJB
- Kacang Message Driven (kacang yang dipandu mesej);
- Kacang Entiti - ditakrifkan dalam spesifikasi entiti JPA (Java Persistence API) dan digunakan untuk menyimpan data;
- Kacang Sesi:
- tanpa negara (tanpa negara)
- stateful (dengan sokongan untuk keadaan sesi semasa)
- singleton (satu objek untuk keseluruhan aplikasi; bermula dari EJB 3.1)
GO TO FULL VERSION