2012-12-10 12 views
5

में काम नहीं कर रहे प्रोटोटाइप स्कोप के साथ चिह्नित किया गया है मेरे दो बीन्स, माता-पिता और बच्चे हैं। बाल बीन मैंने प्रोटोटाइप गुंजाइश के रूप में घोषित किया है।
मैं चाहता हूं कि नए बच्चे की वस्तु का उपयोग माता-पिता वर्ग में किसी भी बच्चे की विधि को कॉल करने के लिए किया जाता है। उदाहरण के लिए। नीचे दिए गए उदाहरण में, मुझे अलग-अलग बच्चे ऑब्जेक्ट पर स्टेटमेंट 1 कॉल विधि कहना है विभिन्न बच्चे ऑब्जेक्ट पर कथन 2 कॉल कहें Hi1बीन स्प्रिंग

एक तरीका है एप्लिकेशनकॉन्टेक्स्टवेयर को लागू करने और किसी भी बच्चे की विधि को कॉल करने से पहले context.getBean("") का उपयोग करके नया बच्चा ऑब्जेक्ट प्राप्त करें। लेकिन मैं ऐसा नहीं करना चाहता।

क्या कोई अन्य विकल्प है?

@Component 
public class Parent{ 

    @Autowired 
    Child child; 

    public void sayHello(){  
     child.sayHi();   -------------- (1) 
    } 

    public void sayHello1(){  
     child.sayHi1();   --------------- (2) 
    } 
} 

@Component 
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE) 
public class Child{ 

    public void sayHi(){ 
     System.out.println("Hi Spring 3.0"); 

    } 

    public void sayHi1(){ 
     System.out.println("Hi1 Spring 3.0 ");  
    } 

} 
+0

यदि यह एक्सएमएल विन्यास था तो आप देखने-विधि दृष्टिकोण का प्रयोग करेंगे, लेकिन वह एनोटेशन में अभी तक उपलब्ध नहीं है, मेरा मानना ​​है कि। http://stackoverflow.com/questions/3891997/how-to-do-spring-lookup-method-injection-with-annotations –

उत्तर

2

मुझे लगता है कि आप एक new Child खुद हर बार बनाने या वास्तव में वसंत संदर्भ का उपयोग एक ताजा सेम प्राप्त करने के लिए किया है।

स्प्रिंग केवल एक नया उदाहरण बनायेगा जब इसे कुछ इंजेक्ट करने की आवश्यकता होगी (प्रोटोटाइप के मामले में)। जब आप कक्षा में होते हैं तो आप प्रभावी रूप से वसंत के दायरे से बाहर होते हैं। @Scope("prototype") bean scope not creating new bean

http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype पार्ट्स 4.4.2 और 4.4.3 प्रासंगिक हैं:

यहाँ एक समान पोस्ट है।

0

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

बात यह है कि माता-पिता के पास केवल एक बच्चा होता है, इसलिए आपके 2 तरीके केवल उस बच्चे के तरीकों का आह्वान करेंगे।

आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? मुझे यकीन है कि इसके लिए एक उचित समाधान है।

10

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

@Component 
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS) 
public class Child{ 

यहाँ एक reference

एक अन्य विकल्प कुछ कहा देखने विधि इंजेक्शन का उपयोग करने में हो सकता है वर्णित here

1

प्रोटोटाइप गुंजाइश का मतलब स्प्रिंग आप एक नया Child वस्तु हर बार जब आप एक के लिए पूछना दे देंगे (एक ऐप संदर्भ से इंजेक्शन या एक स्पष्ट बीन पुनर्प्राप्ति के माध्यम से)। आपके Parent कक्षा में, आपने केवल एक बार Child के लिए कहा था, इसलिए आपको केवल एक ही मिला है। आप अपने Parent में दो अलग अलग Child वस्तुओं चाहते हैं, तो दो autowire:

@Component 
public class Parent{ 

    @Autowired 
    Child child; 

    @Autowired 
    Child child1; 

    public void sayHello(){  
     child.sayHi(); 
    } 

    public void sayHello1(){  
     child1.sayHi1(); 
    } 
} 
संबंधित मुद्दे