Enterprise 中級

シングルトン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
難易度
中級
シングルトンEJBとCDI @ApplicationScopedの比較
利用可能

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

シングルトンEJBは並行性管理(@Lock・@ConcurrencyManagement)と即時初期化(@Startup)をEJBコンテナにバンドルします。CDIの@ApplicationScopedビーンははるかに少ない記述量で同じシングルインスタンスのライフサイクルを実現します。並行性制御が必要な場合は、EJBのロックアノテーションよりも標準のjava.util.concurrentユーティリティの方が細かい制御ができます。

共有 𝕏 🦋 in