2010-04-26 11 views
26

की छिपी हुई विशेषताएं Google Guice कुछ महान निर्भरता इंजेक्शन सुविधाएं प्रदान करती है।Google Guice

उदहारण के लिए:

मैं हाल ही में @Nullable सुविधा है जो आप वैकल्पिक (अनुमति देने के नल) के रूप में निर्माता तर्क को चिह्नित करने के बाद से Guice डिफ़ॉल्ट रूप से इन की अनुमति नहीं देती की अनुमति देता है में आए

public Person(String firstName, String lastName, @Nullable Phone phone) { 
    this.firstName = checkNotNull(firstName, "firstName"); 
    this.lastName = checkNotNull(lastName, "lastName"); 
    this.phone = phone; 
} 

https://github.com/google/guice/wiki/UseNullable

है कि लोगों का उपयोग Guice (विशेष रूप से कम स्पष्ट वाले) की अन्य उपयोगी विशेषताएं क्या हैं? की

+6

यह एक छिपी हुई विशेषता कैसी है? यह सर्वोत्तम प्रथाओं की मार्गदर्शिका में है जो मुख्य पृष्ठ से दो क्लिक हैं। –

+1

यह वास्तव में तीन है, अगर आप इसके बारे में pedantic बनना चाहते हैं ...! – Jon

उत्तर

39

कोई भी उन्हें नहीं देने के लिए करना है, लेकिन ये मेरी पसंदीदा हैं 'Guice में बोनस सुविधाओं':

  • Guice inject a TypeLiteral<T>, प्रभावी रूप से विलोपन को हराने कर सकते हैं।
  • TypeLiteralgeneric type resolution कर सकते हैं: इस आपको बताता है कि मिल() पर एक सूची < स्ट्रिंग > एक इटरेटर < स्ट्रिंग > देता है।
  • Types जावा के सामान्य प्रकार इंटरफेस के कार्यान्वयन के लिए एक कारखाना है।
  • Grapher इंजेक्टरों को कल्पना करता है। यदि आपका कस्टम प्रदाता HasDependencies लागू करता है, तो यह इस ग्राफ को बढ़ा सकता है।
  • Modules.override() एक चुटकी में अविश्वसनीय रूप से आसान है।
  • पैरामीटरयुक्त कुंजी को परिभाषित करने के लिए लघु वाक्यविन्यास: नई कुंजी < सूची < स्ट्रिंग > >() {}।
  • Binder.skipSources() आपको उन एक्सटेंशन को लिखने देता है जिनके त्रुटि संदेश लाइन नंबरों को सही तरीके से ट्रैक करते हैं।
  • The SPIElements.getElements() परमाणुओं में एक मॉड्यूल तोड़ता है और Elements.getModule() उन्हें एक साथ वापस रखता है।
  • यदि आप मॉड्यूल में बराबर() और हैशकोड() लागू करते हैं, तो आप समस्या के बिना उस मॉड्यूल को कई बार इंस्टॉल कर सकते हैं।
13

मुझे पसंद है कैसे पूरी तरह से Scope इंटरफ़ेस खोलने है: मूल रूप से, यह Provider से Provider करने के लिए सिर्फ एक परिवर्तन है। (ठीक है, Key और Provider से Provider)

कुछ चीजें मूल रूप से सिंगलटन बनना चाहते हैं, लेकिन हर आधा घंटे डेटाबेस से फिर से पढ़ना चाहते हैं? इसके लिए एक गुंजाइश बनाना आसान है। पृष्ठभूमि में कुछ अनुरोधों को चलाने के लिए चाहते हैं, और एक गुंजाइश है जिसका अर्थ है "सभी पृष्ठभूमि अनुरोध एक ही HTTP अनुरोध से शुरू हुए?" Scope लिखना अपेक्षाकृत आसान है।

परीक्षण के दौरान अपने सर्वर पर कुछ Key गुंजाइश करना चाहते हैं ताकि यह प्रत्येक परीक्षण के लिए एक अलग उदाहरण का उपयोग कर सके जो आप किसी ग्राहक से चल रहे हैं? (एक कुकी या अतिरिक्त HTTP पैरामीटर में टेस्ट आईडी पास करने वाले परीक्षण के साथ) यह करना मुश्किल है, लेकिन यह पूरी तरह से संभव है और इसलिए someone's already written that for you

हां, Scope का अत्यधिक दुरुपयोग जेसी को दांव और लहसुन लौंग के लिए शिकार करना शुरू कर देगा, लेकिन इसकी अद्भुत लचीलापन वास्तव में उपयोगी हो सकती है।

+1

दोनों मायने रखता है! –

12

Guice में से एक बढ़िया सुविधा कितना आसान है, किसी भी Module में विधि इंटरसेप्टर को लागू करने का उपयोग कर बनाता है:

public void bindInterceptor(
    Matcher<? super Class<?>> classMatcher, 
    Matcher<? super Method> methodMatcher, 
    MethodInterceptor... interceptors); 

अब, किसी भी है कि Module के दायरे में classMatcher मिलान एक वर्ग के भीतर methodMatcher मिलान विधि के द्वारा रोका जाता है interceptors

उदाहरण के लिए:

bindInterceptor(
    Matchers.any(), 
    Matchers.annotatedWith(Retryable.class), 
    new RetryableInterceptor()); 

अब, हम बस @Retryable के साथ किसी भी विधि टिप्पणी कर सकते हैं और हमारे RetryableInterceptor पुन: प्रयास किया जा सकता है अगर यह विफल रहता है।

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