2011-05-22 9 views
11

वसंत के साथ, आप एक सरणी संपत्ति को परिभाषित कर सकते हैं और स्प्रिंग को दिए गए प्रकार से प्राप्त प्रत्येक (@ कॉम्पोनेंट) कक्षा में से एक इंजेक्ट कर सकते हैं।गुइस के साथ एक इंटरफ़ेस के सभी कार्यान्वयन/उप-वर्ग कैसे प्राप्त करें?

क्या गुइस में इसके लिए समतुल्य है? या इस व्यवहार को जोड़ने के लिए एक विस्तार बिंदु?

उत्तर

11

यह गुइस MultiBinder के लिए उपयोग के मामले की तरह दिखता है। आप ऐसा ही कुछ हो सकता है:

interface YourInterface { 
    ... 
} 

class A implements YourInterface { 
    ... 
} 

class B implements YourInterface { 
    ... 
} 

class YourModule extends AbstractModule { 
    @Override protected void configure() { 
     Multibinder.newSetBinder(YourInterface.class).addBinding().to(A.class): 
     Multibinder.newSetBinder(YourInterface.class).addBinding().to(B.class): 
    } 
} 

और आप एक Set<YourInterface> कहीं भी इंजेक्षन कर सकते हैं:

class SomeClass { 
    @Inject public SomeClass(Set<YourInterface> allImplementations) { 
     ... 
    } 
} 

कि आपको क्या चाहिए के साथ मेल खाना चाहिए।

+0

यह वास्तव में करता है। मुझे सही दिशा बताने के लिए धन्यवाद। –

+0

आपको एक अलग जार ("गुइस एक्सटेंशन") में मल्टीबिंडिंग मिलेगी: http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.google.inject.extensions%22%20AND% 20 ए% 3 ए% 22 गुइस-मल्टीबिंडिंग% 22 – Peti

6

Guice Multibindings आप स्पष्ट रूप से (A & B के लिए YourInterface को addBinding करने के लिए) की आवश्यकता होती है। आप एक अधिक "पारदर्शी" (स्वचालित) इस तरह के क्या AFAIK स्प्रिंग आउट-ऑफ-द-बॉक्स है, तो यह सोचते हैं कि Guice पहले से ही के बारे में A & B जानता है क्योंकि आप पहले से A & B कहीं और के लिए एक बाध्यकारी वैसे भी है प्रदान करता है के रूप में समाधान चाहते हैं, तो भले ही स्पष्ट नहीं है लेकिन सिर्फ अंतर्निहित उदाहरण है कहीं और एक @Inject, तो और उसके बाद आप वैकल्पिक रूप से स्वत: खोज के लिए कुछ इस तरह (inspired by as done here, accessing Guice injector in a Module के आधार पर) इस्तेमाल कर सकते हैं के माध्यम से: फिर

class YourModule extends AbstractModule { 
    @Override protected void configure() { } 

    @Provides 
    @Singleton 
    SomeClass getSomeClass(Injector injector) { 
     Set<YourInterface> allYourInterfaces = new HashSet<>(); 
     for (Key<?> key : injector.getAllBindings().keySet()) { 
      if (YourInterface.class.isAssignableFrom(key.getTypeLiteral().getRawType())) { 
      YourInterface yourInterface = (YourInterface) injector.getInstance(key); 
      allYourInterfaces.add(yourInterface); 
     } 
     return new SomeClass(allYourInterfaces); 
    } 
} 

ध्यान दें कि यह दृष्टिकोण किसी भी classpath स्कैनिंग की आवश्यकता नहीं है; यह इंजेक्टर में आईएस-ए YourInterface के लिए पहले से ही ज्ञात बाइंडिंग को देखता है।

+0

मैं वही कोशिश कर रहा हूं। लेकिन यह काम नहीं कर रहा है। http://stackoverflow.com/questions/43705146/get-all-the-instance-subclass-of-trait-using-google-guice – Sky

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