Enterprise 中級

JNDIルックアップとCDIインジェクションの比較

不安定なJNDI文字列ルックアップを型安全なCDIインジェクションに置き換える。

✕ Java EE
public class OrderService {
    private DataSource ds;

    public void init() throws NamingException {
        InitialContext ctx = new InitialContext();
        ds = (DataSource) ctx.lookup(
            "java:comp/env/jdbc/OrderDB");
    }

    public List<Order> findAll()
            throws SQLException {
        try (Connection con = ds.getConnection()) {
            // query orders
        }
    }
}
✓ Jakarta EE 8+
@ApplicationScoped
public class OrderService {
    @Inject
    @Resource(name = "jdbc/OrderDB")
    DataSource ds;

    public List<Order> findAll()
            throws SQLException {
        try (Connection con = ds.getConnection()) {
            // query orders
        }
    }
}
このコードに問題がありますか? お知らせください。
🔒

型安全な接続

インジェクションエラーは文字列ルックアップによる実行時ではなく、デプロイ時に検出されます。

🗑️

ボイラープレートなし

InitialContextの生成・JNDI名文字列・NamingException処理が不要になります。

🧪

テスト容易

依存関係はフィールドインジェクションなので、ユニットテストでモックに簡単に置き換えられます。

旧来のアプローチ
JNDIルックアップ
モダンなアプローチ
CDI @Inject
JDKバージョン
11
難易度
中級
JNDIルックアップとCDIインジェクションの比較
利用可能

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

従来のJNDIパターンでは文字列ベースのリソース名を使い、NamingExceptionを処理し、InitialContextを管理する必要があります。CDIの@Inject(またはコンテナリソースには@Resource)によりコンテナが依存関係を自動的に接続します。タイポはコンパイル時エラーになり、依存関係を直接注入できるためクラスのテストも容易です。

共有 𝕏 🦋 in