この記事では、EJB (エンタープライズ JavaBeans) について説明します。このテクノロジーは Java EE 仕様の一部です。次のような問題について触れます。
- EJBとは何ですか?
- EJBの歴史は何ですか?
- EJBにはどのような種類がありますか?
EJB の簡単な歴史
この記事の著者が 5 歳だった 1996 年当時、Java は開発者の間ですでに人気がありました。その理由は、フレンドリーな API、自動ガベージ コレクションなどでした。Java はバックエンドを担当するシステムで広く使用されていました。ただし、この言語の魅力にもかかわらず、当時のプログラマーは、まだ JDK に実装されていない特定の機能を必要としていました。これらのニーズは次のとおりです。- データの永続性を確保する。
- トランザクションの整合性
- データへの競合アクセス (マルチスレッド制御)。
- そしておそらく何か他のもの。
EJBとは
EJB は、ある意味で集合的な用語であり、文脈に応じて、Enterprise JavaBeans テクノロジ自体、または EJB テクノロジの一部である特定の Enterprise JavaBean ソフトウェア コンポーネント (Bean) のいずれかを意味します。テクノロジーとしての EJB の定義は Wikipedia にあります。 Enterprise JavaBeans (略語 EJB としてもよく使用されます) は、ビジネス ロジックを含むサーバー コンポーネントを作成およびサポートするためのテクノロジーの仕様です。これは Java EE の一部です。このテクノロジは通常、ビジネス ロジックで次のサービスの少なくとも 1 つ (多くの場合はすべて) が必要な場合に使用されます。- データ永続性のサポート: プログラムを停止した後でもデータは安全である必要があります。ほとんどの場合、データベースを使用して実現されます。
- 分散トランザクションのサポート。
- 並列データ変更とマルチスレッドのサポート。
- イベントサポート。
- ネーミングとディレクトリのサポート (JNDI)。
- データへのアクセスのセキュリティと制限。
- アプリケーションサーバーへの自動インストールのサポート。
- リモートアクセス。
EJBの種類
要約しましょう。EJB は、特別なアノテーションの 1 つでマークされた通常の Java クラスです。このようなクラスは Bean と呼ばれます。クラスがどのようなアノテーションでマークされているかに応じて、そのクラスは 1 つまたは別のタイプの EJB (Bean) の代表になります。豆には主に次の 3 種類があります。- メッセージ駆動型 Bean (メッセージ駆動型 Bean)。
- エンティティ Bean - JPA (Java Persistence API) 仕様で定義され、データの保存に使用されます。
- セッション Bean。
- ステートレス(状態なし);
- ステートフル (現在のセッション状態をサポート);
- シングルトン (アプリケーション全体に 1 つのオブジェクト。EJB 3.1 以降)。
セッション Bean
セッション Bean (セッション Bean) は、特定の種類の Bean です。これらは、クライアントが Bean のメソッドを呼び出すことによってプログラムで呼び出すことができるビジネス ロジックをカプセル化します。メソッド呼び出しでは次のことができます。- セッション Bean と同じ JVM 内の別のクラスによってローカルに。
- Java RMI (Remote Method Invocation) テクノロジを使用して、ネットワーク経由で別の JVM からリモートで実行できます。
@Stateless
。以下に例を挙げてみましょう。
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
現在のセッション状態 (ステートフル) をサポートするセッション Bean は、同じクライアントからの呼び出し間の状態に関する情報を保持し、クライアントからの明示的な要求に応じて存在を終了します。これは、ステートフル Bean がクライアントごとに一意であるという事実によって実現されます。このタイプの Bean が担当できるタスクの例としては、オンライン ストアのショッピング カートを各ユーザーに対して最新の状態に保つことが挙げられます。これらの Bean のライフサイクルは、EJB コンテナによって管理されます。これらの Bean は、クライアントが終了するときにも破棄されます。このような Bean も非常に簡単に作成できます。これは、アノテーション が付けられた Java クラスですStateful
。以下の例:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
シングルトン セッション Bean は、アプリケーションの存続期間中に 1 回開始され、アプリケーションの存続期間全体にわたって存在します。このような Bean は、1 つの状態をすべてのクライアントで共有する必要がある状況向けに設計されています。ステートレス Bean と同様、スタンドアロン Bean では、開発者は Bean 内の環境がスレッドセーフな方法で編成されていることを確認する必要があります。シングルトン Bean の例を示します。シングルトン Bean は、上で説明した対応するものと同じくらい簡単に作成できます。これが注釈 が付いた Java クラスであることは簡単に推測できます@Singleton
。ただし、この場合は注意が必要です。構文は同じですが、目的が異なり、異なるパッケージに配置されている 2 つのアノテーションがあります。
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
。以下の例:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
メッセージ駆動型 Bean
メッセージ駆動型 Bean (MDB)、またはメッセージ駆動型 Bean は、セッション Bean などのビジネス ロジックを実装します。ただし、親戚とは異なり、MDB には重要な違いが 1 つあります。クライアントが MDB メソッドを直接呼び出すことはありません。このような Bean は、ほとんどの場合、JMS (Java Message Service) メッセージのリスナーとして機能し、システムの部分間での非同期メッセージ交換を組織する役割を果たします。このようなメッセージの例としては、自動小売システムから供給管理システムへの在庫の配送要求があります。以下は MDB Bean の例です。セッション Bean とは異なり、その作成はもう少し興味深いものです。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();
}
}
}
アノテーションにより、MessageDriven
MDB クラスが Bean になります。アノテーション内では、JNDI (JNDI についてはこちらを参照してください) を使用して、クラスがリスナーとなる JMS ディストリビューションの名前が決定されます。さらに、このクラスはインターフェイスMessageListener
とそのメソッドを実装しますonMessage
。このメソッドは、アノテーション内で定義された名前を持つメッセージがキュー/ディストリビューションから到着したときに呼び出されますMessageDriven
。
エンティティ Bean
EJB テクノロジーの一部は JPA 仕様です。JPA (Java Persistence API) は、Java オブジェクト (エンティティ Bean) のオブジェクト リレーショナル マッピング (ORM) を提供し、そのようなオブジェクトを格納、取得、管理するための API を提供する仕様です。JPA を使用すると、データベースのデータを Java オブジェクトとして表現したり、Java オブジェクトをレコードとしてデータベースに保存したりできます。すべてのクラスがそのようなオブジェクトとして機能するわけではありませんが、Entity Bean はそのようなオブジェクトとして機能します。Entity Bean は、データベース内のテーブルを表す Java クラスです。表示 (マッピング) は、特別なアノテーションを使用して実現されます。彼らの助けを借りて、Java クラスがデータベース内のテーブルと比較され、Java クラスのフィールドがデータベース テーブルのフィールドと比較されます。コード内にコメントを含む Entity Bean の例を次に示します。@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...
}
このタイプの Bean は、JPA 仕様を検討するというコンテキストでのみ検討することに意味があることに注意してください。
アプリケーションの作成: EJB HelloWorld
このセクションでは、小さな Java EE HelloWorld アプリケーションを作成し、GlassFish サーバーにデプロイします。この記事を読む前に、ローカル環境のセットアップに関する記事を読むことを強くお勧めします。-
IntelliJ IDEA で新しい Maven プロジェクトを作成します。
ファイル -> 新規 -> プロジェクト...
-
「次へ」をクリックします。
-
Maven プロジェクトのパラメーターを入力します。
-
「完了」をクリックします
-
プロジェクトが作成され、次の構造になっています。
<?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>
次に、Java コードに進みます。私たちのアプリケーションは最も単純なものになります。1 つのサーブレットと 1 つの EJB があります。これはステートレス セッション Bean になります。EJB 内では、文字列「Hello World」を返すメソッドを 1 つだけ定義します。まず、パッケージを作成しましょうcom.javarush.lectures
。次に、パッケージ内にcom.javarush.lectures
Bean (DemoEJB) を作成します。Bean コードは以下のとおりです。
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
前にも述べたように、すべては非常にシンプルです。次のステップは、HTTP リクエストへの応答として EJB からの値を渡すサーブレットを作成することです。サーブレットはこの記事の主題ではありませんが、EJB をデモするにはサーブレットを使用する必要があることに注意してください。DemoServlet
これを行うには、 EJB と同じパッケージ内に新しいサーブレットを作成しましょう。そのコードは以下のとおりです。
@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());
}
}
コードに関する短いコメントをいくつか示します。Abstract @WebServlet("/helloWorld")
- エンドポイントへの HTTP リクエストを処理するサーブレットとしてクラスを定義します/helloWorld
。私たちのクラスには 1 つのフィールドがあります - DemoEJB ejb
。これは前に定義した Bean です。クラスフィールドに対するアノテーション -@EJB
依存関係注入 (DI) を実行します。それらの。ejb 変数は、必要に応じて新しいインスタンスで自動的に初期化されます。私たちのクラスは HttpServlet の子孫であり、スーパークラス メソッドの 1 つをオーバーライドしますdoGet
。このメソッドは HTTP GET リクエストを処理し、2 つのパラメータ -HttpServletRequest
と を受け取りますHttpServletResponse
。HttpServletRequest
受信 HTTP リクエストに関する情報を取得するために機能します。HttpServletResponse
リクエストに対するレスポンスを生成するために必要です。メソッド内では、を使用してPrintWriter
応答オブジェクト ( HttpServletResponse
)からオブジェクトを取得しますgetWriter()
。次に、 を使用して、結果のオブジェクトに値を書き込むことができますwrite
。実際、これは、PrintWriter
定義した EJB から取得した値 (値は文字列「Hello World!」) を -a オブジェクトに書き込むことによって使用されます。HTTP リクエストを送信したクライアントは、リクエストに対する応答としてこの値を受け取ります。次のステップは、GlassFish Java EE サーバー上でアプリケーションを起動することです。これを行うには、ローカル環境のセットアップに関する記事で説明されているように、新しい構成を作成します。以下は、現在のプロジェクトの完成した構成のスクリーンショットです。開始する前に、GlassFish サーバーがインストールされていることを確認してください。 起動構成を作成した後、「実行」->「ejb_demo を実行」メニューを使用するか、 Shift+F10ホットキーを使用してアプリケーションを起動します。起動後、ログが表示されます。 また、ブラウザが開きます。 これはすべて、アプリケーションが意図したとおりに動作していることを示しています。
結論
この記事では、EJB (Enterprise JavaBeans) について説明しました。私たちは次のような質問を検討しました。- EJBとは何ですか?
- EJBの歴史
- さまざまな種類の EJB
- メッセージ駆動型 Bean (メッセージ駆動型 Bean)。
- エンティティ Bean - JPA (Java Persistence API) エンティティ仕様で定義され、データの保存に使用されます。
- セッション Bean:
- ステートレス (状態なし)
- ステートフル (現在のセッション状態のサポートあり)
- シングルトン (アプリケーション全体に 1 つのオブジェクト、EJB 3.1 以降)
GO TO FULL VERSION