シングルトンEJBとCDI @ApplicationScopedの比較
シングルトンEJBをCDI @ApplicationScopedビーンに置き換えてシンプルな共有状態管理を実現する。
コード比較
✕ Java EE
@Singleton
@Startup
@ConcurrencyManagement(
ConcurrencyManagementType.CONTAINER)
public class ConfigCache {
private Map<String, String> cache;
@PostConstruct
public void load() {
cache = loadFromDatabase();
}
@Lock(LockType.READ)
public String get(String key) {
return cache.get(key);
}
@Lock(LockType.WRITE)
public void refresh() {
cache = loadFromDatabase();
}
}
✓ Jakarta EE 8+
@ApplicationScoped
public class ConfigCache {
private volatile Map<String, String> cache;
@PostConstruct
public void load() {
cache = loadFromDatabase();
}
public String get(String key) {
return cache.get(key);
}
public void refresh() {
cache = loadFromDatabase();
}
}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
アノテーションノイズの削減
@ConcurrencyManagement・@Lock・@Startupが不要で、@ApplicationScopedの1つだけです。
柔軟な並行性制御
java.util.concurrentのロックやvolatileで必要なスレッドセーフティを精密に制御できます。
テスト容易
プレーンなCDIビーンはEJBコンテナなしでテスト内で直接インスタンス化できます。
旧来のアプローチ
@Singleton EJB
モダンなアプローチ
@ApplicationScoped CDI
JDKバージョン
11
難易度
中級
JDKサポート
シングルトンEJBとCDI @ApplicationScopedの比較
利用可能
Jakarta EE 8 / Java 11以降、広く利用可能
仕組み
シングルトンEJBは並行性管理(@Lock・@ConcurrencyManagement)と即時初期化(@Startup)をEJBコンテナにバンドルします。CDIの@ApplicationScopedビーンははるかに少ない記述量で同じシングルインスタンスのライフサイクルを実現します。並行性制御が必要な場合は、EJBのロックアノテーションよりも標準のjava.util.concurrentユーティリティの方が細かい制御ができます。
関連ドキュメント