10

EJB3.0に基づく新しいプロジェクトを開始しています。私は「春」ベースのバックグラウンドを持っている(そしてそれが大好きです)ので、私にとって緩い結合とテスト容易性は大きな必需品です。この投稿は「ejbvs.spring」に関するものであってはなりません。あなたがすでにこれで実際のプロジェクト経験を持っているならば、それは完璧でしょう。

問題を示すためのサンプルコードを次に示します。

クライアント->ejb->コラボレーター1->コラボレーター..->コラボレーターn

<!-- language: java -->
@Stateless
public class SampleService {

    // or @Inject via CDI
    // or @Autowired via Spring
    @EJB // or just use a stateless session bean via EJB 3.0
    private Bank bank;

    // same for this component
    @EJB
    private Calculator calc;

    // both collaborators must be settable from outside, to make everything testable (and mockable)

    /**
     * sample "business service" called from client
     */
    public void debit(BigDecimal amount){
        calc.calculate(amount.subtract(new BigDecimal(100)));
        bank.debit(amount);
    }

}

// or via @Component (Spring), or CDI?
@Stateless // or Stateless Session bean with optional @Service/@Singleton annotation?
public class Calculator {
    public void calculate(BigDecimal subtract) {
        // calculate stuff....
    }
}

// or via @Component (Spring), or CDI?
@Stateless // or Stateless Session bean with optional @Service/@Singleton annotation?
public class Bank {
    public void debit(BigDecimal amount) {
        // ...
    }
}

ejb 3.0ですべてのコラボレーターとそのコラボレーターに依存性注入を実装するための最良の方法を知りたいですか?この意味での共同作業者は、非常に小さな専用クラスである可能性があります。

これまでに次のオプションについて説明してきましたが、いつものようにまだ適切な結論は出ていません:)

  1. ejb標準は、すべてがステートレスセッションBeanであり、すべての結果(プーリング、リソース処理など)でのみ使用されます。

  2. ステートレスセッションBeanを「ビジネスコンポーネント」(エントリポイント)として使用し、それ以降

a)スプリングワイヤード依存関係(「jbosssnowdrop」統合による)

b)CDI有線依存関係(ejb3.0およびjbosseap 5.1のWELD経由)

単体テストでBeanをどのように使用できるかを知る必要はありません。私が求めている答えは、実行中のappserver内のすべての依存関係を接続するための最良のアプローチです(Spring vs. Guice vs. CDI vs.EJB)。外側のEJB(「ビジネスエントリポイント」)から下に向かってグラフを知る必要があるだけです。したがって、外部のすべて(サーブレット、フロントエンドなど)はこの質問の範囲ではありません:)

プロジェクトにEJB3.0とjbosseap5.1が設定されていると仮定してください:)

あなたの答えと、うまくいけばプロジェクトベースの知識を楽しみにしています。

4

4 に答える 4

4

メソッドレベルのトランザクション管理、セキュリティ、同時実行管理、またはセッションBeanが提供できるその他のサービスが必要な場合は、それらをEJBセッションBeanにします。マネージドBeanから始めて、必要に応じてセッションBeanにすることができます。

これらのセッションBeanをマネージドBean(CDIではmeta-infディレクトリにbeans.xmlファイルを含むjarファイル内のすべてのもの)に挿入する場合は、@EJBを使用します。プレーンマネージドBeanをセッションBeanに注入する場合は、@Injectを使用します。

リモートセッションBean(または任意のJava EEリモートリソース)を挿入する場合は、このリンクで、アダプタークラスを介してこれを実行する方法について説明します。基本的に、ルックアップなどの厄介な文字列をすべて1つの場所に保持し、これらのリモートリソースを他の注入可能なBeanと同じように扱うことができます(アダプターメンバー変数の@Producesアノテーションを介して)。これを行う必要はありませんが、お勧めします。

タイプセーフなリソースインジェクション

于 2011-04-07T23:17:58.920 に答える
3

私は間違いなくフレームワークの混合に反対票を投じます。

私はEJB、Spring、JBoss Seamに接続されているプロジェクトに取り組んでいます(また、half-Flex、half-JSFフロントエンドもあります)。真のテクノロジー動物園!
とにかく、それをすべて一緒に配線することは最悪の部分ではありません、それらのフレームワークは柔軟な注入機能を持っています。テストも多かれ少なかれ耐えられます。
最も苦痛だったのは、さまざまなライフサイクルモデルによって引き起こされたメモリリークを取り除き、トランザクションを同期し、スレッド化の動作をクリーンアップすることでした。

今、私たちは純粋なJava EE 6に移行しています(Spring、Flexを取り除き、SeamからCDIに移行しています)。これまでのところ、結果には本当に満足しています。ところで、私は春を批判していません。Java EEまたはSpringスタックのいずれかに固執し、それらを混合することは単に問題を引き起こします。

于 2014-02-14T12:26:39.527 に答える
2

一般的に、Javaには「選択肢が多すぎる」ので、この分野でも確かにそうです。私はEJBを汎用の依存性注入フレームワークとして説明するのではなく、目的のためにDIを使用します。それがコーディングしたい方法である場合は、この目的のためのフレームワークを追加することを検討する必要があります。あなたが春を知っていて好きなら、それのために行きなさい。これを行う方法を理解するためにさらに別のフレームワークが必要な場合は、 GuiceとEJB(これは素晴らしいクックブックです)も効果的に使用しました。

于 2011-03-14T18:01:01.953 に答える
0

テストの依存性注入を許可することが主な目標である場合は、これらの値を保護に変更するか、セッターを与えることで、これらの値を設定可能にすることをお勧めします。私はMockitoを使用してJavaEEEJB 3.0のすべてをスタブ化するのが好きで、統合テスト以外のテストを実行してMockitoがメソッドをスタブ化できるようにする場合ですが、同じクラスに基づくいくつかの異なるBeanですが、依存関係が異なるため、Yishaiが言ったように、Springを上にして使用することをお勧めします。

于 2011-03-14T20:58:17.017 に答える