2013-09-06 14 views
9

मेरी निर्भरता का 99% @Autowired स्प्रिंग एनोटेशन के माध्यम से डी पैटर्न के साथ प्रबंधन है।वसंत सेवा लोकेटर या शुद्ध कारखाना पैटर्न?

फिर भी एक विशेष परिदृश्य में, मैं निर्धारित नहीं कर सकता कि रन-टाइम तक कौन सा कार्यान्वयन किया जाना चाहिए।

सबसे ज्ञात मामला, पार्सर्स के कई कार्यान्वयन है।

पहला समाधान कई @Autowired (बदसूरत मोड) का इस्तेमाल किया करने के लिए

Interface Parser { 
    <T> T parse(); 
} 

@Component("JsonParser") 
class JsonParser implements Parser { 
    ... 
} 

@Component("XmlParser") 
class XmlParser implements Parser { 
    ... 
} 

class MyService { 
    @Autowired 
    @Qualifier("XmlParser") 
    Parser xmlParser; 

    @Autowired 
    @Qualifier("JsonParser") 
    Parser jsonParser; 

    ...  
} 

है लेकिन अगर मैं कार्यान्वयन की एक बड़ी संख्या है स्वीकार्य नहीं हो सकता है।

दूसरा समाधान स्प्रिंग

interface ParserServiceLocatorFactory { 
    public Parser getParser(String parserName); 
} 

interface Parser { 
    <T> T parse(); 
} 

@Component("JsonParser") 
class JsonParser implements Parser { 
    ... 
} 

@Component("XmlParser") 
class XmlParser implements Parser { 
    ... 
} 

class MyService { 
    @Autowired 
    ServiceFactory parserServiceLocatorFactory; 

    void exampleMethod() { 
     Parser xmlParser = parserServiceLocatorFactory.getParser("XmlParser"); 
    } 
} 

से ServiceLocator इस्तेमाल किया इस तरह से मेरे लिए सही लगता है, लेकिन तीसरे समाधान के साथ तुलना करने के लिए है?

तीसरा समाधान शुद्ध फैक्ट्री पैटर्न का उपयोग करना और इसे इंजेक्ट करना है।

@Component 
public ParserFactory { 
    Parser getParser(String parserName) { 
     ... 
    } 
} 

interface Parser { 
    <T> T parse(); 
} 

@Component("JsonParser") 
class JsonParser implements Parser { 
    ... 
} 

@Component("XmlParser") 
class XmlParser implements Parser { 
    ... 
} 

class MyService { 
    @Autowired 
    ParserFactory parserFactory 

    void exampleMethod() { 
     Parser xmlParser = parserFactory.getParser("XmlParser"); 
    } 
} 

आप समर्थक पिछले समाधान, या मेरी समस्या के लिए भी बेहतर समाधान के लिए/चोर है, तो?

पुनश्च: यह छद्म कोड है मैं तुम्हें सूची इंजेक्शन का उपयोग कर सकते एक विकल्प के रूप में कुछ छोटी बातों :)

उत्तर

8

छूट सकते हैं:

public class SomeService { 

    @Autowired 
    private List<Parser> parsers; 

    public doSomethingWithParser(...) { 
     ... 
     Parser parser = getParser(JsonParser.class); 
     parser.parse(...); 
     ... 
    } 

    private Parser getParser(Class<Parser> targetClass) { 
     Parser result = null; 
     for(Parser parser : parsers) { 
      if(parser.getClass().equals(targetClass)){ 
       result = parser; 
      } 
     } 
     return transformer; 
    } 

} 

और भी बेहतर, आप paser का पता लगाने कोड को आसान बनाने के Parser.isCompatibleWith(SomeInput input) विधि जोड़ सकते हैं ।

+0

हम एक सूची के लिए @ संभव है? मुझे पता है कि एक्सएमएल का उपयोग करना संभव है लेकिन मैंने एनोटेशन के बारे में कभी नहीं सुना। क्या आपके पास कुछ डॉक्टर लिंक हैं? – Kakawait

+1

हां, यह संभव है। मैं वास्तव में अपने वर्तमान प्रोजेक्ट में इस दृष्टिकोण का उपयोग कर रहा हूं। [टाइप किए गए संग्रह उदाहरण पर जाएं] (http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-autowired-annotation)। –

+0

ऊपर सुझाए गए दृष्टिकोण में मामूली संशोधन पार्सर प्रकारों के एमएपी संग्रह का उपयोग करना होगा। इस तरह, आप नक्शा कुंजी का उपयोग करके निरंतर समय में लुकअप कर सकते हैं जो कि प्रकार का नाम है। जब भी आप एक पार्सर सेवा देखना चाहते हैं तो यह फॉर लूप से बच जाएगा। – Kingz

5

नीचे सेवा लोकेटर वर्ग का एक उदाहरण है। यह सेवा रजिस्ट्री से दी गई आईडी के लिए एक सेवा देता है। रजिस्ट्री एक एमएपी है जो दिखाए गए अनुसार स्वचालित है। यह एक उत्पादन प्रणाली से एक कामकाजी उदाहरण है:

@Service 
public class MyServiceLocator { 

    @Autowired 
    private Map<String, MyService> myServiceRegistry; 

    /** 
    * Service locator to find the right Domain service to interact with the  requested data store 
    * 
    * @param serviceID 
    * @return 
    */ 
    public MyService locateServiceFor(String serviceID) { 
     //Using the Given string 'serviceID' as key, lookup the service from the Registry 
     return myServiceRegistry.get(serviceID); 
} 
संबंधित मुद्दे