0Pricing
Spring Boot 4 Microservices & REST APIs · درس

نطاقات الحبوب

تعرّف إلى نطاقات singleton وprototype وrequest وsession

نطاقات الحبوب درس مجاني في Spring Boot 4 Microservices & REST APIs على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Spring Boot 4 Microservices & REST APIs، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Spring Boot 4 Microservices & REST APIs 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

What a Scope Controls

A bean’s scope determines how many instances the container creates and how long each lives. The default and most common scope is singleton.

Choosing the right scope matters for state, memory, and thread safety.

Singleton Scope

With singleton scope, the container creates exactly one instance per ApplicationContext and returns it for every injection point. This is ideal for stateless services.

@Service // singleton by default
public class PricingService {
    public BigDecimal price(Order o) { /* stateless */ }
}

Singletons Must Be Thread-Safe

Because one singleton serves all concurrent requests, it must not hold mutable per-request state in fields. Keep singletons stateless, or guard shared state carefully.

  • Good: read-only config, injected collaborators
  • Bad: a mutable field updated per request

Prototype Scope

Prototype scope creates a new instance every time the bean is requested or injected. Use it for stateful, short-lived helpers that should not be shared.

@Component
@Scope("prototype")
public class ReportBuilder {
    private final List<String> rows = new ArrayList<>();
    public void addRow(String r) { rows.add(r); }
}

The Prototype-in-Singleton Trap

If you inject a prototype into a singleton via the constructor, you get one instance, captured once — not a fresh one per use. The singleton is built only once, so the prototype is resolved only once.

Getting Fresh Prototypes

To obtain a new prototype each time inside a singleton, inject an ObjectProvider (or a lookup) and call it on demand.

@Service
public class ReportService {
    private final ObjectProvider<ReportBuilder> builders;
    public ReportService(ObjectProvider<ReportBuilder> builders) {
        this.builders = builders;
    }
    public Report build() {
        ReportBuilder rb = builders.getObject(); // fresh each call
        return rb.toReport();
    }
}

Web Scopes Overview

In a web application, two extra scopes tie a bean’s lifetime to an HTTP interaction: request and session. They exist only while a request or session is active.

Request Scope

A request-scoped bean is created once per HTTP request and discarded when it completes. Useful for per-request context like a correlation id or accumulated request data.

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestContext {
    private String correlationId;
    // getters/setters
}

Session Scope

A session-scoped bean lives for the duration of a user’s HTTP session, holding per-user state across multiple requests, such as a shopping cart in a server-rendered app.

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserCart {
    private final List<Item> items = new ArrayList<>();
}

Why Scoped Proxies

Injecting a short-lived scoped bean into a long-lived singleton needs a proxy. The proxy is injected once but delegates each call to the correct current-request or current-session instance.

That is why request/session beans use proxyMode = TARGET_CLASS.

Choosing a Scope

Guidelines:

  • singleton — default; stateless shared services
  • prototype — stateful, per-use helpers
  • request — per-HTTP-request context
  • session — per-user state across requests

Quick Check

Test your understanding of scopes.

Recap

Scope controls instance count and lifetime.

  • singleton (default) — one per context, keep stateless
  • prototype — new instance per request; beware the singleton trap
  • request/session — web scopes needing scoped proxies
  • Use ObjectProvider for fresh prototypes inside singletons

الأسئلة الشائعة

هل درس «نطاقات الحبوب» مجاني؟

نعم — نص درس «نطاقات الحبوب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Spring Boot 4 Microservices & REST APIs، انتقل إلى CoddyKit PRO. تتضمن دورة Spring Boot 4 Microservices & REST APIs 4 دروس في المجموع.

ماذا ستتعلم في «نطاقات الحبوب»؟

تعرّف إلى نطاقات singleton وprototype وrequest وsession تتمرن على Spring Boot 4 Microservices & REST APIs مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Spring Boot 4 Microservices & REST APIs؟

لا تُشترط خبرة سابقة. Spring Boot 4 Microservices & REST APIs على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «نطاقات الحبوب»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Spring Boot 4 Microservices & REST APIs هذا؟

نعم. كل درس في Spring Boot 4 Microservices & REST APIs يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. حاوية Spring IoC
  2. الحقن عبر المُنشئ مقابل الحقول
  3. نطاقات الحبوب
  4. استدعاءات دورة الحياة
← العودة إلى Spring Boot 4 Microservices & REST APIs