web-dev-qa-db-ja.com

SpringやEJB3、あるいはそれらすべてを一緒に使用する必要がある、または便利なのはいつですか?

JSF2 + Spring + EJB3の使用、またはそれらの任意の組み合わせに少し混乱しています。 Springの主な特徴の1つは依存性注入であることは知っていますが、JSF管理Beanを使用すると@ManagedBeanおよび@ManagedPropertyアノテーションと依存関係注入機能を利用できます。 EJB3を使用すると、JSFと一緒にいつ使用するのか、または使用する理由さえあるのか、さらに混乱します。

では、どのような状況でSpring + JSF2またはEJB3 + JSF2を使用するのが良いでしょうか?

これまでは、JSF2のみを使用していくつかの小さなWebアプリケーションを作成しており、SpringやEJB3を使用する必要はありませんでした。しかし、私は多くの場所で、人々がこれらすべてのものを一緒に使用しているのを見ています。

39
user2018726

まず、SpringとEJB(+ JTA)は競合するテクノロジーであり、通常、同じアプリケーションで一緒に使用することはできません。どちらかを選択してください。春またはEJB(+ JTA)。どちらを選択するかはお伝えしません。簡単に判断できるように、少しだけ歴史と事実をお話しします。


彼らが解決しようとしている主な問題は、自動トランザクション管理を備えたビジネスサービスレイヤーAPIを提供することです。単一のビジネスタスク(注文など)を実行するために複数のSQLクエリを実行する必要があり、それらの1つが失敗した場合、もちろんeverythingがロールバックされることを想像してください戻ると、まるで何も起こらなかったかのように、DBは以前と同じ状態に保たれます。トランザクションを使用しなかった場合、クエリの最初の束が実際に成功したため、DBは無効な状態のままになります。

基本的なJDBCに精通している場合は、接続で自動コミットをオフにしてから、それらのクエリを順番に実行し、commit()を実行することで、catch (SQLException)を非常に同じtryで実行し、rollback() a _ [機能] _が実行されます。しかしながら、これは毎回実装するのにかなり 面倒/ です。

SpringとEJB(+ JTA)では、単一の(ステートレス)ビジネスサービスメソッドの呼び出しは、デフォルトで、単一の完全なトランザクションとして透過的にカウントされます。この方法では、トランザクション管理についてまったく心配する必要がありません。 EntityManagerFactoryを手動で作成したり、em.getTransaction().begin()を明示的に呼び出したりする必要はありません。たとえば、ビジネスサービスロジックをJSFバッキングBeanクラスに密結合している場合や、代わりに_RESOURCE_LOCAL_を使用している場合などです。 JPAのJTAの。たとえば、JPAを利用する次のEJBクラスだけを使用できます。

_@Stateless
public class OrderService {

    @PersistenceContext
    private EntityManager em;

    @EJB
    private ProductService productService;

    public void placeOrder(Order newOrder) {
        for (Product orderedproduct : newOrder.getProducts()) {
            productService.updateQuantity(orderedproduct);
        }

        em.persist(newOrder);
    }

}
_

JSFバッキングBeanに_@EJB private OrderService orderService;_があり、アクションメソッドでorderService.placeOrder(newOrder);を呼び出すと、単一の完全なトランザクションが実行されます。たとえば、updateQuantity()呼び出しまたはpersist()呼び出しのいずれかが例外で失敗した場合、これまでに実行されたupdateQuantity()呼び出しはロールバックされ、DBはクリーンで鮮明な状態のままになります。もちろん、JSFバッキングBeanでその例外をキャッチして、facesメッセージなどを表示することもできます。

「Spring」は、EJBだけでなくCDIやJPAとも競合する非常に大きなフレームワークであることに注意してください。以前は、暗いJ2EE時代、EJB 2.xの実装が非常にひどかった(上記のEJB 3.x OrderServiceの例では、EJB 2.xでは、少なくとも5倍のコードといくつかのXMLコードが必要でした)。 Springははるかに優れた代替手段を提供し、必要なJavaコード(ただし、まだ多くのXMLコード)です。J2EE/ EJB2はSpringから教訓を学び、Java EE 5は、Springよりも洗練されており、XMLをまったく必要としない新しいEJB3 APIを提供します。

Springは、IoC/DI(制御の反転、依存性注入)も提供しています。これは、XMLで構成されたJ2EE時代のことであり、非常に多用される可能性があります。現在、Springもアノテーションを使用していますが、それでもXMLが必要です。 Java EE 6なので、Springからの教訓を学んだ後、CDIは同じDI機能を提供するためにボックスから提供されますが、XMLは必要ありません。SpringDI _@Component_/_@Autowired_およびCDI _@Named_/_@Inject_ JSFが_@ManagedBean_/_@ManagedProperty_で行うのと同じことができますが、Spring DIおよびCDIにはさらに多くの利点があります周辺:たとえば、インタープロセスを前処理または後処理のマネージドBeanの作成/破棄またはマネージドBeanのメソッド呼び出しに記述したり、カスタムスコープ、プロデューサー、コンシューマーを作成したり、より狭いスコープのインスタンスをインスタンスに挿入したりできます。より広い範囲などの.

Springは、JSFと本質的に競合するMVCも提供します。 JSFとSpring MVCを組み合わせても意味がありません。さらに、Springは、本質的にJPA上の追加の抽象化レイヤーであるDataも提供し、DAOボイラープレートをさらに最小限に抑えます(ただし、本質的にはビジネスサービスレイヤー全体を表すものではありません)。

以下も参照してください。

66
BalusC

春はたくさんあるので、ここでは簡単な答えはありません。

非常に高いレベルでは、SpringはJava EEと競合します。つまり、それらのいずれかを完全なスタックフレームワークとして使用します。

より細かいレベルでは、Spring IoCコンテナとSpring Beanは、Java EE。でCDIとEJBの組み合わせと競合します。

Webレイヤーに関しては、Spring MVCはJSFと競合します。一部のSpring xyzTemplateはJPAインターフェースと競合します(どちらも、たとえばHibernateをそれらの実装として使用できます)。

組み合わせることができます。たとえば、Spring MVCでCDIおよびEJB Beanを使用する、OR JSFでSpring Beanを使用する。

通常、2つの直接競合する技術を一緒に使用しません。同じアプリ内のSpring Bean + CDI + EJB、またはSpring MVC + JSFはばかげています。

5
Mike Braun