نطاق الـ bean (scope) يتحكم في كم نسخة تُنشئ الحاوية وكم تعيش. أما استدعاءات دورة الحياة (lifecycle callbacks) فتتيح لك تشغيل كود بعد إنشاء الـ bean مباشرة وقبل تدميره مباشرة.
نطاق الـ bean (scope) يتحكم في كم نسخة تُنشئ الحاوية وكم تعيش. أما استدعاءات دورة الحياة (lifecycle callbacks) فتتيح لك تشغيل كود بعد إنشاء الـ bean مباشرة وقبل تدميره مباشرة.
@Service // singleton افتراضيًا — OrderService واحد مشترك للتطبيق كله
public class OrderService { }
@Component
@Scope("prototype") // نسخة جديدة عند كل getBean/حقن
public class ReportBuilder { }
الفخّ الكلاسيكي: حقن prototype داخل singleton. يُوصَّل الـ singleton مرة واحدة، فيحتفظ بنسخة prototype واحدة إلى الأبد — فيُخلَف وعد "جديد في كل مرة". أصلحه بـ @Lookup، أو ObjectProvider<ReportBuilder>، أو scoped-proxy.
@Component
public class ConnectionPool {
@PostConstruct // يعمل بعد حقن الاعتماديات، قبل الاستخدام
public void open() { /* افتح المقابس، سخّن الـ caches */ }
@PreDestroy // يعمل عند الإغلاق السلس للحاوية (singletons فقط)
public void close() { /* حرّر الموارد */ }
}
مهم: لا يستدعي Spring @PreDestroy على beans من نوع prototype — إذ يسلّمها ويتوقف عن تتبّعها، فتملك أنت تنظيفها.
هذا يفصل من يعامل Spring كسحر عمن يفهم الحاوية. علة الـ singleton الذي يحتفظ بـ prototype سيناريو مقابلة مفضّل لأنه دقيق ويسبّب عللًا إنتاجية حقيقية. معرفة أن الـ singletons يجب أن تكون عديمة الحالة وآمنة على الخيوط (thread-safe) (فهي مشتركة عبر كل خيوط الطلبات) هي الخلاصة العملية التي يصغي لها المُحاورون.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع