JavaRush /Java Blog /Random-JA /EJBの紹介
Анзор Кармов
レベル 31
Санкт-Петербург

EJBの紹介

Random-JA グループに公開済み
この記事では、EJB (エンタープライズ JavaBeans) について説明します。このテクノロジーは Java EE 仕様の一部です。次のような問題について触れます。
  • EJBとは何ですか?
  • EJBの歴史は何ですか?
  • EJBにはどのような種類がありますか?
また、EJB とサーブレットを使用して小さな HelloWorld アプリケーションを作成します。 EJB の紹介 - 1この記事は、Java SE に慣れてきて、Java EE の学習を始めている読者に役立ちます。この記事の実践的な部分を完全に理解するには、まず「ローカル環境のセットアップ」の記事を読むことをお勧めします。

EJB の簡単な歴史

この記事の著者が 5 歳だった 1996 年当時、Java は開発者の間ですでに人気がありました。その理由は、フレンドリーな API、自動ガベージ コレクションなどでした。Java はバックエンドを担当するシステムで広く使用されていました。ただし、この言語の魅力にもかかわらず、当時のプログラマーは、まだ JDK に実装されていない特定の機能を必要としていました。これらのニーズは次のとおりです。
  • データの永続性を確保する。
  • トランザクションの整合性
  • データへの競合アクセス (マルチスレッド制御)。
  • そしておそらく何か他のもの。
これらすべてが、自家製の、自分で作成した、閉鎖された図書館の人口の自然な増加につながりました。言い換えれば、誰もが自分のニーズを可能な限り満たしました。それは、IBM が「誰もが同じ方法で自分のニーズを満たすべきである」というスローガンを掲げ、1997 年に Enterprise Java Bean (EJB) 仕様をリリースするまでのことでした。これにより、開発プロセスを統合し、典型的な問題 (ニーズとして上記で説明した) の解決策をフレームワークに組み込むことが可能になりました。Sun は IBM の発案を 2 年間にわたって採用し、1999 年に EJB 1.0 仕様をリリースしました。このようにしてこのテクノロジーが誕生しました。これについては、より応用的な観点からさらに説明します。

EJBとは

EJB は、ある意味で集合的な用語であり、文脈に応じて、Enterprise JavaBeans テクノロジ自体、または EJB テクノロジの一部である特定の Enterprise JavaBean ソフトウェア コンポーネント (Bean) のいずれかを意味します。テクノロジーとしての EJB の定義は Wikipedia にあります。 Enterprise JavaBeans (略語 EJB としてもよく使用されます) は、ビジネス ロジックを含むサーバー コンポーネントを作成およびサポートするためのテクノロジーの仕様です。これは Java EE の一部です。このテクノロジは通常、ビジネス ロジックで次のサービスの少なくとも 1 つ (多くの場合はすべて) が必要な場合に使用されます。
  • データ永続性のサポート: プログラムを停止した後でもデータは安全である必要があります。ほとんどの場合、データベースを使用して実現されます。
  • 分散トランザクションのサポート。
  • 並列データ変更とマルチスレッドのサポート。
  • イベントサポート。
  • ネーミングとディレクトリのサポート (JNDI)。
  • データへのアクセスのセキュリティと制限。
  • アプリケーションサーバーへの自動インストールのサポート。
  • リモートアクセス。
上記のサービスは、間違いなく EJB テクノロジーの利点です。もう 1 つの利点は、上記のすべてが箱から出してすぐに機能することです。それらの。プログラマは分散トランザクションのサポートについて考える必要はありません。プログラマーは、現在実装しようとしているビジネス ロジックについて考えるだけで済みます。特定のソフトウェア コンポーネントとしての EJB は、アプリケーションのビジネス ロジックの一部を含む EJB 仕様からの 1 つ以上のアノテーションを備えた Java クラスです。EJB 仕様のアノテーションは、タグ付けされたクラスに特定の権限、パワー、スーパーパワーを与えます。詳細については、以下を参照してください。

EJBの種類

要約しましょう。EJB は、特別なアノテーションの 1 つでマークされた通常の Java クラスです。このようなクラスは Bean と呼ばれます。クラスがどのようなアノテーションでマークされているかに応じて、そのクラスは 1 つまたは別のタイプの EJB (Bean) の代表になります。豆には主に次の 3 種類があります。
  • メッセージ駆動型 Bean (メッセージ駆動型 Bean)。
  • エンティティ Bean - JPA (Java Persistence API) 仕様で定義され、データの保存に使用されます。
  • セッション Bean。
後者 (セッション Bean) は、いくつかのサブタイプに分類されます。
  • ステートレス(状態なし);
  • ステートフル (現在のセッション状態をサポート);
  • シングルトン (アプリケーション全体に 1 つのオブジェクト。EJB 3.1 以降)。
EJB の紹介 - 2以下では、それぞれの種類の豆について詳しく見ていきます。

セッション Bean

セッション Bean (セッション Bean) は、特定の種類の Bean です。これらは、クライアントが Bean のメソッドを呼び出すことによってプログラムで呼び出すことができるビジネス ロジックをカプセル化します。メソッド呼び出しでは次のことができます。
  • セッション Bean と同じ JVM 内の別のクラスによってローカルに。
  • Java RMI (Remote Method Invocation) テクノロジを使用して、ネットワーク経由で別の JVM からリモートで実行できます。
「セッション」という言葉は、サーバーが特定のタスクを実行している間のみ Bean が使用可能であり、サーバーの障害またはシャットダウンの場合には回復不能に破棄されることを意味します。セッション Bean インスタンスのライフサイクルは、EJB コンテナによって制御されます (EJB コンテナについて詳しくは、シリーズの最初の講義を参照してください)。 ステートレス セッション Bean は、その状態に関する情報を保存しません。このタイプのコンポーネントは、さまざまなクライアントで使用できます。ステートレス Bean は、1 回の操作で完了できるビジネス プロセスを実装するために使用されます。たとえば、顧客の信用履歴を確認するなどです。単一の Bean インスタンスは複数のクライアントで使用できるため、開発者は Bean のデータへのスレッドセーフなアクセスを提供する必要があります。このタイプの Bean (他のすべてのセッション Bean と同様) の作成は非常に簡単です。これは、アノテーションが付いた通常の Java クラスです@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
EJB を作成するには、 のアノテーションを使用する必要があります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();
        }
    }

}
アノテーションにより、MessageDrivenMDB クラスが 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 サーバーにデプロイします。この記事を読む前に、ローカル環境のセットアップに関する記事を読むことを強くお勧めします。
  1. IntelliJ IDEA で新しい Maven プロジェクトを作成します。

    ファイル -> 新規 -> プロジェクト...

    EJB の紹介 - 3
  2. 「次へ」をクリックします。

  3. Maven プロジェクトのパラメーターを入力します。

    EJB の紹介 - 4
  4. 「完了」をクリックします

  5. プロジェクトが作成され、次の構造になっています。

    EJB-5 の紹介
pom.xml ファイルは次のようになります。 EJB-6 の紹介まず、Java EE API への依存関係を追加し、Web アプリケーション アーカイブ (war) の形式でプロジェクトのパッケージ化を指定する必要があります。これを行うには、pom.xml コードを次の形式に変更する必要があります。
<?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.lecturesBean (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と を受け取りますHttpServletResponseHttpServletRequest受信 HTTP リクエストに関する情報を取得するために機能します。HttpServletResponseリクエストに対するレスポンスを生成するために必要です。メソッド内では、を使用してPrintWriter応答オブジェクト ( HttpServletResponse)からオブジェクトを取得しますgetWriter()。次に、 を使用して、結果のオブジェクトに値を書き込むことができますwrite。実際、これは、PrintWriter定義した EJB から取得した値 (値は文字列「Hello World!」) を -a オブジェクトに書き込むことによって使用されます。HTTP リクエストを送信したクライアントは、リクエストに対する応答としてこの値を受け取ります。次のステップは、GlassFish Java EE サーバー上でアプリケーションを起動することです。これを行うには、ローカル環境のセットアップに関する記事で説明されているように、新しい構成を作成します。以下は、現在のプロジェクトの完成した構成のスクリーンショットです。開始する前に、GlassFish サーバーがインストールされていることを確認してください。 EJB-7 の紹介起動構成を作成した後、「実行」->「ejb_demo を実行」メニューを使用するか、 Shift+F10ホットキーを使用してアプリケーションを起動します。起動後、ログが表示されます。 EJB-8の紹介また、ブラウザが開きます。 EJB-9の紹介これはすべて、アプリケーションが意図したとおりに動作していることを示しています。

結論

この記事では、EJB (Enterprise JavaBeans) について説明しました。私たちは次のような質問を検討しました。
  • EJBとは何ですか?
  • EJBの歴史
  • さまざまな種類の EJB
EJB には次のタイプがあることを思い出してください。
  • メッセージ駆動型 Bean (メッセージ駆動型 Bean)。
  • エンティティ Bean - JPA (Java Persistence API) エンティティ仕様で定義され、データの保存に使用されます。
  • セッション Bean:
    • ステートレス (状態なし)
    • ステートフル (現在のセッション状態のサポートあり)
    • シングルトン (アプリケーション全体に 1 つのオブジェクト、EJB 3.1 以降)
また、EJB を使用して小さな HelloWorld アプリケーションも作成しました。PD は、この記事の実践的な部分を自分で繰り返すことができます。次に、ステートフル Bean とシングルトン Bean を使用して値を受け取る 2 つのサーブレットをアプリケーションに追加します。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION