2015-06-30 13 views
6

मुझे लगता है मैं इस इंटरफेसस्प्रिंग autowire इंटरफ़ेस

@Component 
@Scope("prototype") 
public class MenuItem implements IMenuItem { 

    private String iconClass; 
    private String link; 
    private String text; 

    public MenuItem(String iconClass, String link, String text) { 
     this.iconClass = iconClass; 
     this.link = link; 
     this.text = text; 
    } 

    //setters and getters 

} 

के लिए एक कार्यान्वयन है तो फिर एक अंतरफलक IMenuItem

public interface IMenuItem { 

    String getIconClass(); 
    void setIconClass(String iconClass); 

    String getLink(); 
    void setLink(String link); 

    String getText(); 
    void setText(String text); 

} 

है वहाँ एक विन्यास वर्ग से MenuItem के कई उदाहरण बनाने के लिए कोई तरीका है, केवल का उपयोग कर IMenuItem इंटरफ़ेस? @autowired या कुछ के साथ? कन्स्ट्रक्टर के तर्कों को निर्दिष्ट करके ऑटोवायर करना भी संभव है?

उत्तर

16

@Autowired वास्तव में इस परिदृश्य के लिए बिल्कुल सही है। आप या तो एक विशिष्ट वर्ग (कार्यान्वयन) को स्वचालित कर सकते हैं या एक इंटरफ़ेस का उपयोग कर सकते हैं।

public interface Item { 
} 

@Component("itemA") 
public class ItemImplA implements Item { 
} 

@Component("itemB") 
public class ItemImplB implements Item { 
} 

अब आप चुन सकते हैं जो इन कार्यान्वयन में से एक @Component एनोटेशन मूल्य

इस तरह

के अनुसार वस्तु के लिए एक नाम का चयन करके बस का उपयोग किया जाएगा:

इस उदाहरण पर विचार

@Autowired 
private Item itemA; // ItemA 

@Autowired 
private Item itemB // ItemB 

एक ही उदाहरण को कई बार बनाने के लिए, आप यह निर्दिष्ट करने के लिए @Qualifier एनोटेशन का उपयोग कर सकते हैं कि कौन सा कार्यान्वयन होगा प्रयोग किया है:

@Autowired 
@Qualifier("itemA") 
private Item item1; 

मामले में आप कुछ विशेष निर्माता मानकों के साथ आइटम का दृष्टांत करने की जरूरत है, आप इसे एक XML कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट करने के लिए होगा। Qulifiers और autowiring का उपयोग करने के बारे में अच्छा ट्यूटोरियल HERE पाया जा सकता है।

+0

मैं केवल एक कार्यान्वयन (MenuItem) बना देगा। मैं उदाहरण के लिए 3 मेनू इटम्स बनाना चाहता हूं, लेकिन केवल इंटरफ़ेस के माध्यम से। –

+0

संपादित उत्तर देखें, उम्मीद है कि यह मदद करता है। आपको क्वालीफायर एनोटेशन – Smajl

1

मेरा मानना ​​है काम का आधा, अपने @scope एनोटेशन द्वारा किया जाता है अगर वहाँ अपनी परियोजना में ImenuItem इंटरफेस के किसी भी दूसरे कार्यान्वयन नीचे कई उदाहरण

@Autowired 
private IMenuItem menuItem 

लेकिन पैदा करेगा नहीं है अगर वहाँ कई कार्यान्वयन हैं, तो आप @Qualifer एनोटेशन का उपयोग करने की आवश्यकता है।

@Autowired 
@Qualifer("MenuItem") 
private IMenuItem menuItem 

यह भी कई उदाहरण

+0

ठीक है, लेकिन क्या कई मेनू इटैम को दिए गए पैरामीटर के साथ इंस्टेंट करने का कोई तरीका है? I @autowired MenuItem में कन्स्ट्रक्टर का उपयोग करने के लिए, डिफ़ॉल्ट खाली कन्स्ट्रक्टर नहीं। –

+0

आपको @Autowired के साथ कन्स्ट्रक्टर को एनोटेट करने की आवश्यकता है। लेकिन यह आदिम डेटा प्रकार के साथ काम नहीं करता है, आपको स्ट्रिंग आइकन क्लास, स्ट्रिंग लिंक, स्ट्रिंग टेक्स्ट के साथ एक और पोजो बनाने की आवश्यकता है और उस पोजो को बीन – Bhupi

+0

के रूप में इंजेक्ट करना होगा क्यों यह कई उदाहरण बनायेगा जब 'IMenuItem' इंटरफ़ेस के लिए केवल एक कार्यान्वयन होगा? – Lucky

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