2016-03-23 16 views
7

मैं एक ही कक्षा में परिभाषित के कई सेम है:एनोटेशन के साथ वसंत में नाम से ऑटोवायर कैसे करें?

@Bean 
    public FieldDescriptor fullSpotField() { 
    FieldDescriptor ans = new FieldDescriptor("full_spot", String.class); 
    return ans; 
    } 

    @Bean 
    public FieldDescriptor annotationIdField() { 
    FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class); 
    return ans; 
    } 

फलस्वरूप जब मैं उन्हें

@Autowired 
    public FieldDescriptor fullSpotField; 

    @Autowired 
    public FieldDescriptor annotationIdField; 

autowire मैं एक अपवाद

NoUniqueBeanDefinitionException: No qualifying bean of type [...FieldDescriptor] is defined: expected single matching bean but found ... 

यह कैसे संभव के रूप में नाम से autowire के लिए मिलता है एक्सएमएल कॉन्फ़िगरेशन में?

उत्तर

19

आप इसे हल करने के लिए @Qualifer का उपयोग कर सकते हैं।

अपने मामले में आप कर सकते हैं:

@Bean 
@Qualifier("fullSpot") // Not mandatory. If not specified, it takes the method name i.e., "fullSpotField" as qualifier name. 
    public FieldDescriptor fullSpotField() { 
    FieldDescriptor ans = new FieldDescriptor("full_spot", String.class); 
    return ans; 
    } 

    @Bean 
    @Qualifier("annotationIdSpot") // Same as above comment. 
    public FieldDescriptor annotationIdField() { 
    FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class); 
    return ans; 
    } 

और बाद में आप उपयोग कर इंजेक्षन कर सकते हैं:

@Autowired 
    @Qualifier("fullSpot") 
    public FieldDescriptor fullSpotField; 

    @Autowired 
    @Qualifier("annotationIdSpot") 
    public FieldDescriptor annotationIdField; 
+2

मैंने पाया कि '@ Qualifier' सेम निर्माण के तरीकों के पास की आवश्यकता नहीं है, यह करने के लिए पर्याप्त है इस टिप्पणी को '@ Autowired' – Dims

+0

@Dims के साथ जोड़ें, आप सही हैं। यदि बीन निर्माण विधि पर 'क्वालीफायर' निर्दिष्ट नहीं है, तो यह पहले बीन के लिए क्वालीफायर नाम के रूप में विधि नाम पूर्व, "fullSpotField" लेता है। –

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