2010-08-09 17 views
16

मान लीजिए कि मैं वसंत config (वसंत के संस्करण 3.0.3 है) निम्नलिखित है दो:ऑब्जेक्ट के बजाय फैक्ट्रीबीन इंजेक्ट कैसे करें?

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

    <bean id="theFactoryBean" class="wax.MyFactoryBean"/> 

    <bean id="factoryBeanUser" class="wax.FactoryBeanUser"> 
     <!-- what should be placed here?--> 
    </bean> 

</beans> 

मैं FactoryBean कार्यान्वयन और कुछ अन्य उदाहरण के कहने की है। मुझे अन्य उदाहरण FactoryBean पर इंजेक्ट करने के लिए स्प्रिंग की आवश्यकता है, न कि ऑब्जेक्ट उत्पन्न करता है।

इसे हल करने के दो संभावित तरीके हैं।

पहले एक, स्पष्ट और malfunctional:

[skipped irrelevant part] 
Caused by: org.xml.sax.SAXParseException: The reference to entity "theFactoryBean" must end with the ';' delimiter. 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) 
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1414) 

मैं इस समाधान Spring: Getting FactoryBean object instead of FactoryBean.getObject() पाया, इस सवाल के जवाब दिए और चार लोगों के रूप में चिह्नित किया गया है:

<bean id="factoryBeanUser" class="wax.FactoryBeanUser"> 
    <property name="myFactoryBean" ref="&theFactoryBean"/> 
</bean> 

इस config वसंत के साथ शुरू पर निम्न अपवाद फेंकता इसके लिए मतदान किया। तो मुझे लगता है कि यह समाधान काम कर सकता है, लेकिन वर्तमान में मेरे कोड में कुछ गड़बड़ है।

दूसरा एक, काम कर रहा है, लेकिन अजीब:

public class FactoryBeanUser implements ApplicationContextAware{ 

private MyFactoryBean myFactoryBean; 

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     myFactoryBean = (MyFactoryBean)applicationContext.getBean("&theFactoryBean"); 
    } 
} 

मेरा प्रश्न यह पहली दृष्टिकोण कार्यात्मक बनाने के लिए या मैं एक दूसरा तरीका के साथ छड़ी चाहिए संभव है?

+0

मैं नहीं मानता संदर्भ नाम को एम्परसैंड द्वारा शुरू कर सकते हैं। मैं इसे हटा दूंगा और पुनः प्रयास करूंगा। इस मामले में संदर्भ कारखाने बीन का बीन नाम होना चाहिए। – duffymo

+0

@duffymo यदि आप सही हैं तो जो लोग किसी अन्य समान विषय के उत्तर देने के लिए मतदान करते थे, वे पूरी तरह से गलत थे :) वैसे भी, अगर मैं फैक्ट्री बीन के नाम पर संदर्भ नाम बदलता हूं, तो स्प्रिंग इंजेक्शन मानता है कि 'फैक्ट्रीबीन' उत्पादन करता है। यह वास्तव में 'फैक्टरीबीन' के लिए बनाया गया है। – wax

+0

मुझे लगता है कि मैं यहां कुछ भी सीखूंगा; मैंने कभी नहीं किया है। मैंने सोचा कि ऐप संदर्भ कारखाना था - आपको किसी और के लिए क्या चाहिए? – duffymo

उत्तर

14

ऐसा लगता है कि एक्सएमएल पार्सर एएमपीएस-इकाई की शुरुआत के रूप में एम्पर्सेंड() का अर्थ देता है। आप ref="&amp;theFactoryBean" का उपयोग करने का प्रयास कर सकते हैं।

spring docs यह स्पष्ट नहीं है कि इस वाक्यविन्यास को किसी XML फ़ाइल में या केवल प्रोग्रामिक लुकअप के साथ अनुमति है या नहीं। लेकिन फिर एक्सएमएल कॉन्फ़िगरेशन ऐप संदर्भ द्वारा उपयोग किया जाता है, इसलिए मुझे लगता है कि &amp; काम करना चाहिए (हालांकि ऐसा लगता है कि यह एक विशेष प्रतीक के लिए सबसे अच्छा विकल्प नहीं रहा है)

यही कारण है कि मैं एक और बात सुझाऊंगा - अगर आप वास्तव में अपने उत्पाद की बजाय फैक्ट्री बीन की आवश्यकता है, एक और बीन बनाएं, जो FactoryBean लागू नहीं करता है, createObject() या उस तरह की कुछ विधि को परिभाषित करें, और इसकी आवश्यकता वाले सभी कारखानों में इसका उपयोग करें।

एक sidenote - बेहतर संस्करण के साथ XSD संदर्भ में शामिल हैं:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

+0

कमाल! यह काम करता हैं। आपकी सहायता के लिए धन्यवाद। – wax

+0

@ वैक्स - सिर्फ रिकॉर्ड के लिए - '& 'काम किया? या वैकल्पिक सुझाव? – Bozho

+1

हां, '& 'काम करता है। मैंने आपको एक और चीज माना जो आपने सुझाया था। मेरे वास्तविक आवेदन में मेरे पास पहले से ही 'बीनफैक्टरी' परिभाषा है जिसे मेरी समस्या को हल करने के लिए थोड़ा संशोधित करने की आवश्यकता है। यही कारण है कि मुझे लगता है कि इसे एक और बीन बनाने के बजाय इसे पुन: उपयोग करना बेहतर होगा। – wax

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