Enterprise 中級

依存性注入とトランザクションのために重量級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
難易度
中級
EJBとCDIの比較
利用可能

Jakarta EE 8 / Java 11以降、広く利用可能

CDI(Contexts and Dependency Injection)はEJBと同じ依存性注入とトランザクション管理を、コンテナ固有のインターフェースやスーパークラスを持たないプレーンなJavaクラスとして提供します。@ApplicationScoped・@RequestScopedなどのスコープがライフサイクルを制御し、@TransactionalがEJBの必須トランザクションセマンティクスを置き換えます。

共有 𝕏 🦋 in