web-dev-qa-db-ja.com

EJBの用途

私は現在Jave-EEを学んでおり、C++の経験が豊富で、JavaSE。Enterpriseの目的がわかりませんJava Beans;誰かが私のためにこれを明確にすることができますか?私はlegacyの使用には興味がありません:これはEJB-3.1とJava-EE6のコンテキストにあります。

従来の3層アーキテクチャのビジネス層を実装するために、ビジネスロジックを含めるためにそれらを使用する人もいるようです。これにより、ドメインロジックがドメインオブジェクトから分離され、 貧血ドメインモデル になります。しかし、それは私のすべてのOOD本能に反します。私はMartinFowlerに同意します これはアンチパターンです 。貧血ドメインモデルに対する反対意見を緩和する必要がありますか?または、EJBには他の用途がありますか?

27
Raedwald

Java EEは、貧血のドメインモデルを自動的に意味するわけではありません。たとえば、Javaベストプラクティスをうまく利用しないものは、 Javaでは不可能だという意味ではありません。MartinFowlerのポイントはJ2EEだったと思います(J2EEの使用に注意してください。Java EE)ではなく、ロジックとデータの操作がほとんど強制されています。POJOベースのエンティティを使用するとデータと動作を適切にモデル化する。EJBの「ビジネスロジック」は通常、ビジネスロジックのアプリケーションを調整しますが、実際には実行しないことが多く、通常は非常に薄いラッパーです。

したがって、EJBはサービスAPIを形成します。これは、使用しているプラ​​ットフォーム/フレームワークに関係なく、物理的に呼び出すことができるものが必要です。これはエントリポイントです。 Spring、Webサービスなどを使用して実装するかどうか...サービス層が必要ですが、これがJava EE。かなり不自然な例です。

@Stateless
public SomeServiceImpl implements SomeService
    someServiceMethod() {
       delegate.doSomething();
    }
}

public SomeServiceDelegate implements SomeService
    someServiceMethod() {
       modelObject.doSomething();
    }
}

他のテクノロジーよりもEJBを好む理由については説明しません。ただ、EJBを使用しても、実装でベストプラクティスを使用できないわけではないことを指摘したいと思います。

6
vickirk

他のいくつかの回答で示されているように、EJBはサービス層の実装に最適です。それらはJava EEの非常にモダンで軽量な種類のBeanです。名前にもかかわらず、J2EEにあった厳格な重量のEJB2獣と比較することはできません。誰もが同意しますそれらは災害でしたが、2002年ではありません。

EJB3(2006)以来、EJBBeanは完全に優れたテクノロジーです。

ここでは、宣言型トランザクション(必要に応じて変更できますが、まだ進行中でない場合はすべての入力メソッドが自動的にトランザクションを開始します)、プーリング、セキュリティを提供することで、多くのを支援します。ロック、リモーティング、そしていくつか。詳細については、次の回答を参照してください。

ここではトランザクションについて説明しましたが、これに加えて、非常に複雑で安全性の高いシステムにのみ必要なものではありません。データベースのみを扱う場合でも、それは基本要件であると私は言います。単純な注文を処理する場合、在庫と注文の両方を更新するか、両方をまったく更新しないようにします。これは、整合性を確保するためにデータベースにPKとFKを含めるのと同じくらい基本的です。

EJBを使用すると、トランザクションの管理が簡単になります。 EJBがないと、txを開始、コミット、またはロールバックするための定型コードがたくさんあります。

また、EJBが提供するプーリングとスタブの利点を過小評価してはなりません。これは、Beanに多数のEJBを注入できることを意味し、そのようなBeanが作成されるたびにそれらがインスタンス化されることを心配する必要はありません。そうでなければ、すべてのEJBが毎回使用されるわけではない場合、これは特に厄介です。

ただし、プーリングのため、非常に軽量なスタブのみが挿入されます。これは、実際のインスタンスを指す一種のURLに似ています。これらは、注入するメモリまたはCPUオーバーヘッドの点でほとんど何のコストもかかりません。

EJBは、シングルトンであることを宣言し、ロック動作(書き込みロック/読み取りロック)を調整し、起動時に開始する必要があることを宣言し、いわゆる拡張永続コンテキスト(TXにスコープされていない永続コンテキスト)を管理できるようにする注釈も備えています。 )など。

これらはすべて、slimエンティティに望まない懸念事項です。多くのアーキテクチャでは、たとえばUserオブジェクトは、レイヤー間で送信したい単純なデータエンティティです。 UserインスタンスにsendMsg()メソッドを持たせ、依存関係としてJMSリソースを持たせたくないので、あるクライアントから突然メッセージを送信できます。なぜこれがどういうわけか「自然」で「OOP」だと人々が考える理由はよくわかりません。

現実の世界では、友人のジョーにハガキを送りたいときはいつでも、sendMsg操作を呼び出さない。代わりに、私はカードを宛てて郵便局に持ってくるか、郵便ポストに入れます。

また、ケーキに対してbake()操作を呼び出しません。代わりに、オーブンなどにケーキを入れます。

21
Arjan Tijms

あなたはすでに「ビジネスロジックの実装」のユースケースを引用しています。

EJB-EJB 3.xセッションBean、メッセージ駆動型Bean、および3.1では、新しいシングルトンBeanを使用すると、実際にbizロジックを実装できます。セッションBeanは、多くの場合、クライアントが接続するファサードとしてサーバーを使用します。これらのクライアントは、サーブレットとしてコンテンツを提供することができます。 HTTPまたは他の(よりバイナリの)プロトコルを介してEJBと通信する「ファット」クライアント。

メッセージ駆動型Beanは非同期通信のエンドポイントとして機能し、例としてセッションBeanのメソッドを呼び出すことができます。

すべてのEJBには1つの共通点があり、非常に魅力的です。それは、コンテナーによって管理されるということです。したがって、コンテナはインスタンス化、プーリング、トランザクション、セキュリティなどを処理します。

EJBで書き込む場合

@Resource DataSource x;

コンテナは、Beanがメソッド呼び出しを受信する準備ができたときに、変数「x」に適切なデータソースが含まれていることを確認します。

Beansをプールすると、インスタンスが共有される(ステートレスSB)か、メモリが不足している場合にインスタンスをコンテナによって2次ストレージにスワップアウトできるため、サイトに接続するクライアントを、それがない場合よりもはるかに多くすることができます。 -後でアクティブにします。

EJB 3では、EJB 1.xおよび2.xの古いEntityBeansがなくなり、JPAに置き換えられます。JPAは、POJOのドメインデータモデルを構築します。JPAは、リレーショナルセマンティクスを提供するために注釈を付けるか、外部によってセマンティクスを提供することができます。 XMLファイル。

JPA(EJBをまったく必要としない)では、EJBは多くの場合これらのエンティティの処理を実装するのに役立ちます。

@Stateless
public class MyBean {
    @PersistenceContext EntityManager em;

    public Foo getFoo(String name) {
        Query q = em.createQuery("SELECT f FROM Foo f WHERE f.name = :name");
        q.setParameter("name",name);
        return q.getSingleValue();
    }
}
6
Heiko Rupp

いくつかのポイント:

  • EJBはそれ自体では存在しません。それらはEJBコンテナに存在し、宣言型セキュリティ、宣言型トランザクション、比較的簡単なクラスタリングなど、非常に便利なサービスを提供します。
  • 貧血ドメインモデルがアンチパターンであることは事実ですが、ビジネスロジックがより複雑になると、たとえば、複数のアプリケーションが同じモデルで動作する場合、ほとんどのロジックをモデルから分離することは、関心の分離の問題になります。
5

個人的な経験からの単なる発言...

EJBの利点に疑いはありませんが、EJBを使用したことがあるので、EJBは、セキュリティとトランザクションが非常に重要な場合(つまり、金融アプリケーション)にのみ適していると思います。 90%の場合、EJBがなくても問題ありません。もう1つ...スケーラビリティとEJBは良い友達ではありません。

3

このような議論の中で、EJBがEJB3で役立つようになると言う人もいますが、それは問題ではありません。まさにJPAで特に強力になりましたが、EJB1.0とEJB2.1はまだ多くのことを行いました。多分彼らはそれを大規模なアプリケーションで使用しなかったので彼らはそう言います。

たとえば、POJOはトランザクションを処理できないため、EJBでは、特定のメソッドのトランザクションタイプを指定できます。これは、新しいトランザクションが必要か、トランザクションからではないかです。

私の組織では、ERPを使用してゼロから構築し、ビジネスロジックでEJBを使用しています。これは2000年のもので、EJBはバージョン1.0でした。これは、ビジネス層を他のthiersですが、システムも互いに分離しています。たとえば、financeモジュールはHRモジュールから分離されています。新しいモジュールを追加する場合は、システムを再起動せずに追加でき、システムと完全に統合されます。 ..

そして、EJBでこれを覚えておいてください。コードに表示されるのは何もありません。EJBコンテナがあなたのために行っていることはすべてです:)。

2
Majed
1
Dead Programmer