Singleton EJB ile CDI @ApplicationScoped Karşılaştırması
Singleton EJB'leri daha basit paylaşılan durum yönetimi için CDI @ApplicationScoped bean'lerle değiştirin.
@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();
}
}
@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();
}
}
Daha az açıklama gürültüsü
@ConcurrencyManagement, @Lock veya @Startup yok — yalnızca tek bir @ApplicationScoped açıklaması.
Esnek eşzamanlılık
Tam olarak ihtiyacınız olan iş parçacığı güvenliği için java.util.concurrent kilitleri veya volatile kullanın.
Kolay test
Düz CDI bean'leri, EJB kapsayıcısı olmadan testlerde doğrudan örneklendirilebilir.
Jakarta EE 8 / Java 11'den itibaren geniş çapta kullanılabilir
Singleton EJB'ler, eşzamanlılık yönetimini (@Lock, @ConcurrencyManagement) ve istekli başlatmayı (@Startup) EJB kapsayıcısına dahil eder. Bir CDI @ApplicationScoped bean, çok daha az törenle aynı tek örnek yaşam döngüsünü elde eder. Eşzamanlılık kontrolü gerektiğinde, standart java.util.concurrent yardımcı programları EJB kilit açıklamalarından daha ince taneli kontrol sağlar.