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
難易度
中級
JDKサポート
JNDIルックアップとCDIインジェクションの比較
利用可能
Jakarta EE 8 / Java 11以降、広く利用可能
仕組み
従来のJNDIパターンでは文字列ベースのリソース名を使い、NamingExceptionを処理し、InitialContextを管理する必要があります。CDIの@Inject(またはコンテナリソースには@Resource)によりコンテナが依存関係を自動的に接続します。タイポはコンパイル時エラーになり、依存関係を直接注入できるためクラスのテストも容易です。
関連ドキュメント