2012-03-22 16 views
10

मैं है एक वर्ग निम्नलिखित टिप्पणी के साथ बार नामित: @Configurable(autowire = Autowire.BY_TYPE)स्प्रिंग autowire और प्रोटोटाइप गुंजाइश

एक निजी सदस्य मैं निम्नलिखित एनोटेशन है पर:

@Autowired(required = true) 
private Foo foo; 

वसंत विन्यास में मैं एक सेम है कक्षा फू का। सेम scope="prototype" साथ परिभाषित किया गया है यदि यह काम नहीं करता है और मैं निम्नलिखित अपवाद:

NoSuchBeanDefinitionException: की उम्मीद कम से कम 1 सेम जो इस के लिए autowire उम्मीदवार के रूप में उत्तीर्ण: प्रकार की कोई मिलती-जुलती सेम फू निर्भरता के लिए मिला निर्भरता

एक बार जब मैं इंजेक्शन बीन स्कोप "singleton" में बदलता हूं तो यह ठीक काम करता है।

प्रोटोटाइप स्कॉप्ड बीन की ऑटो वायरिंग की अनुमति नहीं है?

क्या कोई कामकाज है (मैन्युअल रूप से बीन प्राप्त करने के बाद)?

अग्रिम धन्यवाद, Avner

+0

संबंधित: http://stackoverflow.com/questions/27776672/spring-protype-scope-behaviour/27782040#27782040 –

उत्तर

9

निम्नलिखित लिंक इस तरह के परिदृश्यों के लिए वैकल्पिक समाधान प्रदान करते हैं:

  1. http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
  2. http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-instances-from-code/

फू को जोड़ने के बारे में पहले लिंक वार्ता:

@Component 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype") 
class Foo 

कारण होगा कौन एक नया उदाहरण हर कॉल।

+0

यह अच्छा है कि आपने क्या लिखा है, लेकिन यह बेहतर होगा अगर आप इसे लिख लेंगे जो इसे प्रॉक्सी के साथ कॉन्फ़िगर करना आवश्यक है :) – tomekK

+0

केवल लिंक उत्तर खराब हैं, यदि दिए गए लिंक गायब हो जाए तो क्या होगा? –

-1

तो इंजेक्शन सेम-क्षेत्र 'के सिंगलटन', सेम का एक ही उदाहरण ऑटो तार हो जाएगा। यदि इंजेक्शन बीन स्कोप 'प्रोटोटाइप' है, तो ऑटो-वायर प्रक्रिया के हिस्से के रूप में नया उदाहरण बनाया जाएगा।

स्प्रिंग का कौन सा संस्करण आप उपयोग कर रहे हैं और अधिक जानकारी के लिए वसंत-संदर्भ.एक्सएमएल भी संलग्न करते हैं।

+1

मुझे प्रोटोटाइप और सिंगलटन के बीच अंतरों के बारे में पता है, मुझे समझ में नहीं आता कि क्यों बीन स्कोप ऑटो-तारों पर प्रभाव डालता है। मैं वसंत 3 का उपयोग कर रहा हूं। –

0

मेरा मानना ​​है कि उस बीन के लिए आपके एक्सएमएल में घोषित प्रोटोटाइप/सिंगलटन चीज मुद्दा है।

प्रोटोटाइप स्कॉप्ड बीन की ऑटो वायरिंग की अनुमति नहीं है?

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

क्या कोई कामकाज है (मैन्युअल रूप से बीन प्राप्त करने के बाद)?

बस स्कोप विशेषता को हटाने का प्रयास करें, क्योंकि यह प्रोटोटाइप विशेषता है, तो इसे पुनर्प्राप्त नहीं किया जाएगा। यदि उन बीन्स (सेवाएं और डीएओ) को आपके एप्लिकेशन कॉन्टेक्स्ट में घोषित किया गया है, तो ऑटोवॉयर एनोटेशन को इसे सिंगलटन के रूप में प्राप्त करने दें क्योंकि डिफ़ॉल्ट बीन्स सिंगलटन हैं, जो यह होना चाहिए।

+0

आपके उत्तर के लिए धन्यवाद लेकिन स्कोप विशेषता को हटाने से मेरा कोड ठीक नहीं होगा क्योंकि सभी बार इंस्टेंस एक ही Foo इंस्टेंस साझा करेंगे जो मुझे चाहिए। अतिरिक्त में फू इंस्टेंस प्रति बार ऑब्जेक्ट सृजन/इंजेक्शन में प्रति बार तत्काल किया जाना चाहिए और प्रति फ़ील्ड उपयोग (जहां तक ​​मेरी समझ नहीं है)। –

+0

मुझे नहीं पता कि आपके विशिष्ट डिजाइन के लिए कोई विकल्प है या नहीं, मुझे बताएं कि क्या है। लेकिन जहां तक ​​डिजाइन का संबंध है, बीन्स का इस्तेमाल एक स्टेटलेस तरीके से किया जाना चाहिए, इसका मतलब है कि अपने खेतों में सावधान रहें, सुनिश्चित करें कि उन बीन्स में खेतों का उपयोग वैश्विक क्षेत्र नहीं है बल्कि विधि फ़ील्ड हैं, इस तरह से यह सिंगलटन भी है, आपने जीता चिंता न करें अगर इसे कई वर्गों द्वारा साझा किया जाता है क्योंकि कोई वैश्विक चर साझा नहीं किया जाता है, क्योंकि यह स्टेटलेस है। – vine

-2

या आप बस नए ऑपरेटर का उपयोग कर सकते हैं।

+1

जो डीआई और आईओसी के पूरे उद्देश्य को पूरी तरह से हरा देता है। – csmckelvey

संबंधित मुद्दे