2009-06-16 17 views
7

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

No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean 

त्रुटि के आधार पर, मैं इसे बाज वर्ग ढूँढने में सक्षम नहीं है अनुमान लगा रहा हूँ, लेकिन मैं कर रहा हूँ यकीन नहीं है कि क्यों। यह मेरी समझ है कि संदर्भ: XML कॉन्फ़िगरेशन में वसंत-कॉन्फ़िगर किया गया तत्व मुझे ऐसा करने की अनुमति देना था। मैंने उचित जार फ़ाइलों (spring-weaving.jar और aspectjweaver.jar) को शामिल करना भी सुनिश्चित किया है।

यहां मेरे सेट अप का एक सरल उदाहरण है।

मेरे एक्सएमएल config:

<beans ...> 
    ... 

    <context:annotation-config/> 
    <context:spring-configured/> 
    <context:component-scan base-package="foo"/> 

    <bean id="bar" class="foo.Bar"/> 
    ... 
</beans> 

मैं एक कामयाब सेम है:

package foo; 

public class Bar { 

    @Autowired 
    private Baz baz; 

    public void setBaz(Baz baz) { 
     this.baz = baz; 
    } 

    ... 
} 

और एक अप्रबंधित सेम:

package foo; 

@Component 
public class Baz { 
    ... 
} 

वहाँ कुछ है मैं याद कर रहा हूँ?

EDIT: लॉग बीन्स को तत्काल स्थापित करता है, और foo.Baz उनमें से एक नहीं है। मुझे नहीं पता कि यह @ कॉम्पोनेंट एनोटेटेड क्लास क्यों नहीं उठा रहा है।

+0

लॉगिंग क्या कहती है? क्या यह उल्लेख करता है कि यह foo पैकेज में ऑटो-डिटेक्टिंग बीन्स है? डीबग लॉगिंग का कहना चाहिए कि @ कॉम्पोनेंट बीन्स पाए गए थे। – skaffman

+0

संयोग से, आप जो करना चाहते हैं उसके लिए पहलू/बुनाई/वसंत-कॉन्फ़िगर किया गया सामान आवश्यक नहीं है। यह सिर्फ बुनियादी autowiring है। – skaffman

उत्तर

11

क्योंकि बार xml के साथ कॉन्फ़िगर किया गया है, इसे केवल xml के साथ कॉन्फ़िगर किया जा सकता है। यानी आप उन्हें मिश्रण नहीं कर सकते हैं। ताकि बाज़ पर "@Autowired" एनोटेशन उठाया नहीं जा रहा है (एनोटेशन में से कोई भी नहीं होगा)। यह तभी होता है जब आप कक्षा के स्तर पर वसंत एनोटेशन जोड़ते हैं कि वसंत अन्य किसी भी एनोटेशन को सुनेंगे।

आपको क्या करने की आवश्यकता होगी xml में बीन को प्रकार के अनुसार स्वचालित रूप से कॉन्फ़िगर करने के लिए कॉन्फ़िगर करें, उस प्रकार के लिए एक सेटटर जोड़ें और आप वांछित व्यवहार प्राप्त करेंगे।

<bean id="bar" class="foo.Bar" autowire="byType"/> 

एक और बात, जब आप @Component साथ एक सेम व्याख्या यह एक वसंत कामयाब सेम है। सिर्फ इसलिए कि यह एक्सएमएल के साथ नहीं बनाया गया है इसका मतलब यह नहीं है कि यह अप्रबंधित है। एक अप्रबंधित बीन वह है जिसे आप वसंत से नहीं मिलता है।

बार और बाज दोनों वसंत प्रबंधित हैं। यह वह तंत्र है जिसे आपने अलग-अलग परिभाषित करने के लिए चुना है।

+0

मेरे हिस्से पर शब्दावली की एक पूर्ण गलतफहमी। बहुत बढ़िया जवाब। धन्यवाद! –

+3

आप एक्सएमएल और एनोटेशन कॉन्फ़िगरेशन मिश्रण कर सकते हैं। – banterCZ

+0

@banterCZ हाँ ... मैंने देखा है कि अब –

6

पिछली प्रतिक्रिया एक पहलू में सही नहीं है। आप बीन्स को स्वचालित रूप से कर सकते हैं जिन्हें अन्यथा एक्सएमएल के साथ कॉन्फ़िगर किया गया है।

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html में खंड 3.4.5 से

:

XML- आधारित विन्यास मेटाडाटा [2] का उपयोग करते समय, आप तत्व की autowire विशेषता के साथ एक सेम परिभाषा के लिए autowire मोड निर्दिष्ट करें। ऑटोवायरिंग कार्यक्षमता में पांच मोड हैं। आप प्रति बीन ऑटोवॉयरिंग निर्दिष्ट करते हैं और इस प्रकार चुन सकते हैं कि कौन से ऑटो स्वायत्त हैं।

आप नाम, प्रकार और निर्माता द्वारा स्वत: कर सकते हैं। यहां इसका एक कच्चा उदाहरण है: http://www.java2s.com/Code/Java/Spring/AutoWiring.htm

-2

त्रुटि आपकी XML कॉन्फ़िगरेशन फ़ाइल में परिभाषित बीन्स के अनुक्रम के कारण है।

अपने एक्सएमएल फ़ाइल पर के रूप में, bar के लिए सेम पहली बार बनाया और फिर अपने निर्भर सेम जिसकी वजह से @Autowiredbaz ढूँढने में सक्षम नहीं है।

आपको पहले baz और फिर bar के लिए बीन घोषित करना होगा।

+0

एक्सएमएल कॉन्फ़िगरेशन में सभी बीन्स कहीं भी घोषित किए जा सकते हैं, ऑर्डर प्रासंगिक नहीं है। –

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

  • कोई संबंधित समस्या नहीं^_^