EJBとCDIの比較
依存性注入とトランザクションのために重量級EJBを軽量CDI Beanに置き換える。
コード比較
✕ Java EE
@Stateless
public class OrderEJB {
@EJB
private InventoryEJB inventory;
public void placeOrder(Order order) {
// container-managed transaction
inventory.reserve(order.getItem());
}
}
✓ Jakarta EE 8+
@ApplicationScoped
public class OrderService {
@Inject
private InventoryService inventory;
@Transactional
public void placeOrder(Order order) {
inventory.reserve(order.getItem());
}
}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
軽量
CDI BeanはEJB固有のインターフェースやデスクリプターを持たないプレーンなJavaクラスです。
統一された注入
@Injectはすべてのマネージドビーン・JAX-RSリソース・Jakarta EEコンポーネントで使えます。
簡単なユニットテスト
EJBプロキシのオーバーヘッドがないプレーンなクラスは、インスタンス化とモックが容易です。
旧来のアプローチ
EJB
モダンなアプローチ
CDI Bean
JDKバージョン
11
難易度
中級
JDKサポート
EJBとCDIの比較
利用可能
Jakarta EE 8 / Java 11以降、広く利用可能
仕組み
CDI(Contexts and Dependency Injection)はEJBと同じ依存性注入とトランザクション管理を、コンテナ固有のインターフェースやスーパークラスを持たないプレーンなJavaクラスとして提供します。@ApplicationScoped・@RequestScopedなどのスコープがライフサイクルを制御し、@TransactionalがEJBの必須トランザクションセマンティクスを置き換えます。
関連ドキュメント