Singleton EJB مقابل CDI @ApplicationScoped
استبدل Singleton EJBs بحبّات 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 واحد.
تزامن مرن
استخدم أقفال java.util.concurrent أو volatile للأمان المطلوب بالضبط للخيوط.
اختبار سهل
يمكن إنشاء حبّات CDI العادية مباشرةً في الاختبارات دون حاوية EJB.
الأسلوب القديم
@Singleton EJB
الأسلوب الحديث
@ApplicationScoped CDI
منذ JDK
11
الصعوبة
متوسط
دعم JDK
Singleton EJB مقابل CDI @ApplicationScoped
متاح
متاح على نطاق واسع منذ Jakarta EE 8 / Java 11
كيف يعمل
تجمع Singleton EJBs إدارة التزامن (@Lock و @ConcurrencyManagement) والتهيئة المبكرة (@Startup) في حاوية EJB. تُحقق حبّة CDI @ApplicationScoped نفس دورة حياة المثيل الواحد بطقوس أقل بكثير. عند الحاجة لضبط التزامن توفر أدوات java.util.concurrent تحكماً أدق من تعليقات قفل EJB.
توثيق ذو صلة