खोज…


सिंगलटन स्कोप

यदि बीन को सिंगलटन स्कोप के साथ परिभाषित किया जाता है, तो स्प्रिंग कंटेनर में आरंभिक रूप से केवल एक ही ऑब्जेक्ट उदाहरण होगा। इस बीन के सभी अनुरोध उसी साझा उदाहरण को वापस करेंगे। यह एक बीन को परिभाषित करते समय डिफ़ॉल्ट गुंजाइश है।

निम्नलिखित MyBean वर्ग को देखते हुए:

public class MyBean {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyBean.class);
    private String property;

    public MyBean(String property) {
        this.property = property;
        LOGGER.info("Initializing {} bean...", property);
    }

    public String getProperty() {
        return this.property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

हम एक सिंगनल बीन को @ बीन एनोटेशन के साथ परिभाषित कर सकते हैं:

@Configuration
public class SingletonConfiguration {

    @Bean
    public MyBean singletonBean() {
        return new MyBean("singleton");
    } 
}

निम्न उदाहरण स्प्रिंग संदर्भ से एक ही सेम को दो बार प्राप्त करता है:

MyBean singletonBean1 = context.getBean("singletonBean", MyBean.class);
singletonBean1.setProperty("changed property");

MyBean singletonBean2 = context.getBean("singletonBean", MyBean.class);

जब हम सिर्फ एक ही साझा किए गए इंस्टेंस को पुनः प्राप्त करते हैं, तो सिंग्लटनबैन 2 प्रॉपर्टी को लॉग करते समय, "परिवर्तित प्रॉपर्टी" संदेश दिखाया जाएगा।

चूंकि उदाहरण अलग-अलग घटकों के बीच साझा किया गया है, इसलिए स्टेटलेस ऑब्जेक्ट्स के लिए सिंगलटन स्कोप को परिभाषित करने की सिफारिश की गई है।

आलसी सिंगलटन बीन्स

डिफ़ॉल्ट रूप से, सिंगलटन बीन्स पूर्व-त्वरित हैं। इसलिए, जब स्प्रिंग कंटेनर बनाया जाता है तो साझा ऑब्जेक्ट इंस्टेंस बनाया जाएगा। यदि हम आवेदन शुरू करते हैं, तो "प्रारंभिक सिंगलटन बीन ..." संदेश दिखाया जाएगा।

अगर हम नहीं चाहते कि सेम पूर्व-त्वरित हो, तो हम सेम परिभाषा में @Lazy एनोटेशन जोड़ सकते हैं। यह बीन को तब तक बनने से रोकेगा जब तक कि यह पहली बार अनुरोध नहीं किया जाता है।

@Bean
@Lazy
public MyBean lazySingletonBean() {
    return new MyBean("lazy singleton");
}

अब, यदि हम स्प्रिंग कंटेनर शुरू करते हैं, तो कोई "इनिशियललाइज़िंग आलसी सिंगलटन बीन ..." संदेश दिखाई नहीं देगा। पहली बार अनुरोध किए जाने तक बीन नहीं बनाई जाएगी:

logger.info("Retrieving lazy singleton bean...");
context.getBean("lazySingletonBean");

यदि हम दोनों सिंगलटन और आलसी सिंगलटन बीन्स के साथ अनुप्रयोग चलाते हैं, तो यह निम्नलिखित संदेश देगा:

Initializing singleton bean...
Retrieving lazy singleton bean...
Initializing lazy singleton bean...

प्रोटोटाइप गुंजाइश

एक प्रोटोटाइप-स्कोप बीन स्प्रिंग कंटेनर स्टार्टअप पर पूर्व-निर्मित नहीं है। इसके बजाय, इस बीन को कंटेनर में भेजने के लिए हर बार एक नया ताज़ा उदाहरण बनाया जाएगा। राज्य की वस्तुओं के लिए इस क्षेत्र की सिफारिश की जाती है, क्योंकि इसका राज्य अन्य घटकों द्वारा साझा नहीं किया जाएगा।

एक प्रोटोटाइप-स्कॉप्ड बीन को परिभाषित करने के लिए, हमें उस स्कोप एनोटेशन को जोड़ने की आवश्यकता है, जिसे हम चाहते हैं कि किस प्रकार का स्कोप निर्दिष्ट किया गया है।

निम्नलिखित MyBean वर्ग को देखते हुए:

public class MyBean {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyBean.class);
    private String property;

    public MyBean(String property) {
        this.property = property;
        LOGGER.info("Initializing {} bean...", property);
    }

    public String getProperty() {
        return this.property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

हम इसकी परिभाषा को प्रोटोटाइप के रूप में बताते हुए एक सेम परिभाषा को परिभाषित करते हैं:

@Configuration
public class PrototypeConfiguration {

    @Bean
    @Scope("prototype")
    public MyBean prototypeBean() {
        return new MyBean("prototype");
    }
}

यह देखने के लिए कि यह कैसे काम करता है, हम बीन को स्प्रिंग कंटेनर से प्राप्त करते हैं और इसके संपत्ति क्षेत्र के लिए एक अलग मूल्य निर्धारित करते हैं। अगला, हम फिर से कंटेनर से बीन प्राप्त करेंगे और उसका मूल्य देखेंगे:

MyBean prototypeBean1 = context.getBean("prototypeBean", MyBean.class);
prototypeBean1.setProperty("changed property");

MyBean prototypeBean2 = context.getBean("prototypeBean", MyBean.class);

logger.info("Prototype bean 1 property: " + prototypeBean1.getProperty());
logger.info("Prototype bean 2 property: " + prototypeBean2.getProperty());

निम्नलिखित परिणाम को देखते हुए, हम देख सकते हैं कि प्रत्येक बीन अनुरोध पर एक नया उदाहरण कैसे बनाया गया है:

Initializing prototype bean...
Initializing prototype bean...
Prototype bean 1 property: changed property
Prototype bean 2 property: prototype

एक सामान्य गलती यह मान लेना है कि बीन प्रति आह्वान या प्रति थ्रेड को फिर से बनाया गया है, यह मामला नहीं है। इसके बजाय एक उदाहरण प्रति इंजेक्शन (या संदर्भ से पुनर्प्राप्ति) बनाया जाता है। यदि एक प्रोटोटाइप स्कॉप्ड बीन को कभी एक सिंगलटन बीन में इंजेक्ट किया जाता है, तो केवल उस प्रोटोटाइप स्कॉप्ड बीन का एक उदाहरण होगा।

स्प्रिंग एक प्रोटोटाइप बीन के पूर्ण जीवनचक्र का प्रबंधन नहीं करता है: कंटेनर इंस्टेंटिअट्स, कॉन्फिगर, सजाता है और अन्यथा एक प्रोटोटाइप ऑब्जेक्ट को असेंबल करता है, इसे क्लाइंट को सौंपता है और फिर उस प्रोटोटाइप उदाहरण का कोई और ज्ञान नहीं है।

वेब-जागरूक संदर्भों में अतिरिक्त स्कोप

कई स्कोप हैं जो केवल एक वेब-जागरूक एप्लिकेशन संदर्भ में उपलब्ध हैं:

  • अनुरोध - प्रति HTTP अनुरोध में नया बीन उदाहरण बनाया गया है
  • सेशन - नया सेम उदाहरण प्रति HTTP सत्र बनाया जाता है
  • आवेदन - नया सेम उदाहरण ServletContext प्रति बनाया गया है
  • GlobalSession - नए बीन का उदाहरण पोर्टलेट वातावरण में वैश्विक सत्र के अनुसार बनाया गया है (सर्वलेट वातावरण में वैश्विक सत्र गुंजाइश सत्र गुंजाइश के बराबर है)
  • websocket - नया सेम उदाहरण प्रति WebSocket सत्र बनाया जाता है

स्प्रिंग वेब एमवीसी वातावरण में वेब-स्कोप बीन्स को घोषित करने और उपयोग करने के लिए कोई अतिरिक्त सेटअप की आवश्यकता नहीं है।

XML कॉन्फ़िगरेशन

<bean id="myRequestBean" class="OneClass" scope="request"/>
<bean id="mySessionBean" class="AnotherClass" scope="session"/>
<bean id="myApplicationBean" class="YetAnotherClass" scope="application"/>
<bean id="myGlobalSessionBean" class="OneMoreClass" scope="globalSession"/>

जावा कॉन्फ़िगरेशन (स्प्रिंग 4.3 से पहले)

@Configuration
public class MyConfiguration {

    @Bean
    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public OneClass myRequestBean() {
        return new OneClass();
    }

    @Bean
    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public AnotherClass mySessionBean() {
        return new AnotherClass();
    }

    @Bean
    @Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public YetAnotherClass myApplicationBean() {
        return new YetAnotherClass();
    }

    @Bean
    @Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public OneMoreClass myGlobalSessionBean() {
        return new OneMoreClass();
    }
}

जावा कॉन्फ़िगरेशन (स्प्रिंग 4.3 के बाद)

@Configuration
public class MyConfiguration {

    @Bean
    @RequestScope
    public OneClass myRequestBean() {
        return new OneClass();
    }

    @Bean
    @SessionScope
    public AnotherClass mySessionBean() {
        return new AnotherClass();
    }

    @Bean
    @ApplicationScope
    public YetAnotherClass myApplicationBean() {
        return new YetAnotherClass();
    }
}

एनोटेशन-प्रेरित घटक

@Component
@RequestScope
public class OneClass {
    ...
}

@Component
@SessionScope
public class AnotherClass {
    ...
}

@Component
@ApplicationScope
public class YetAnotherClass {
    ...
}

@Component
@Scope(scopeName = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class OneMoreClass {
    ...
}

@Component
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class AndOneMoreClass {
    ...
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow