2013-02-04 39 views
7

मैं नीचे के रूप में एक परिदृश्य सामने आने वाले:कई धागा भर में वसंत सेम संदर्भ

MyBean - एक्सएमएल विन्यास में परिभाषित किया जाता है।

मुझे माईबीन को कई धागे में इंजेक्ट करने की आवश्यकता है। लेकिन मेरी आवश्यकताएं हैं: 1) दो अलग-अलग धागे में पुनर्प्राप्त संदर्भ अलग होना चाहिए 2) लेकिन मुझे एक ही संदर्भ प्राप्त करना चाहिए चाहे मैं एकल धागे से बीन को कितनी बार पुनर्प्राप्त करूं।

उदाहरण के लिए:

Thread1 { 

    run() { 
     MyBean obj1 = ctx.getBean("MyBean"); 
     ...... 
     ...... 
     MyBean obj2 = ctx.getBean("MyBean"); 
    } 
} 

Thread2 { 

    run(){ 
     MyBean obj3 = ctx.getBean("MyBean"); 
    } 
} 

तो मूल रूप से obj1 == obj2 लेकिन obj1 != obj3

उत्तर

10

आप SimpleThreadScope नामक कस्टम स्कोप का उपयोग कर सकते हैं।

Spring प्रलेखन से:

Spring 3.0 के रूप में, एक धागा गुंजाइश उपलब्ध है, लेकिन पंजीकृत नहीं है डिफ़ॉल्ट रूप से। अधिक जानकारी के लिए, SimpleThreadScope के लिए दस्तावेज़ देखें। इस या को किसी भी अन्य कस्टम स्कोप को पंजीकृत करने के निर्देशों के लिए, अनुभाग 3.5.5.2, “Using a custom scope” देखें।

यहाँ कैसे SimpleThreadScope गुंजाइश रजिस्टर करने के लिए का एक उदाहरण:

<bean id="foo" class="foo.Bar" scope="thread"> 

तुम भी कर सकते हैं:

Scope threadScope = new SimpleThreadScope(); 
beanFactory.registerScope("thread", threadScope); 

फिर, आप अपने सेम की परिभाषा में इसका इस्तेमाल करने में सक्षम हो जाएगा स्कोप पंजीकरण घोषणात्मक रूप से:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> 
     <property name="scopes"> 
      <map> 
       <entry key="thread"> 
        <bean class="org.springframework.context.support.SimpleThreadScope"/> 
       </entry> 
      </map> 
     </property> 
    </bean> 

    <bean id="foo" class="foo.Bar" scope="thread"> 
     <property name="name" value="bar"/> 
    </bean> 

</beans> 
2

क्या आप की आवश्यकता एक नया थ्रेड स्थानीय कस्टम गुंजाइश है। आप या तो अपना खुद का या use the one here लागू कर सकते हैं।

कस्टम थ्रेड स्कोप मॉड्यूल के लिए थ्रेड स्कोप्ड बीन्स प्रदान करने के लिए एक कस्टम स्कोप कार्यान्वयन है। एक बीन के लिए प्रत्येक अनुरोध उसी धागे के लिए एक ही उदाहरण लौटाएगा।