2012-04-13 5 views
12

Guice की मेरी समझ है जो:Guice: क्षेत्र इंजेक्शन के प्रभाव

  • निर्माता स्तर के इंजेक्शन (@Inject public class Widget(Dep one, Dep two)) तात्पर्य कि Guice हमेशा कि निर्माता हर बार यह एक Injector के माध्यम से शुरू हो जाती है इंजेक्षन जाएगा; और
  • विधि स्तरीय इंजेक्शन (@Inject public void setDepOne(Dep one)) कि Guice हमेशा उस विधि जब भी यह कहा जाता है इंजेक्षन जाएगा, जब तक कि Widget वस्तु Guice Injector

का उपयोग कर बनाया गया था इन दोनों पूर्वानुमान सही हैं तात्पर्य? यदि नहीं, तो कृपया स्पष्ट करें!

तो मुझे जो लटका हुआ है वह है: फ़ील्ड-स्तरीय इंजेक्शन के प्रभाव क्या हैं?

@Inject private Dep one; 

इसका मतलब यह है कि Guice हमेशा संपत्ति इंजेक्षन जाएगा जब वस्तु Guice इंजेक्टर के माध्यम से बनाया जाता है? उस मामले में मैं कल्पना करता हूं कि यह कन्स्ट्रक्टर-स्तर इंजेक्शन के साथ संघर्ष करता है।

उदाहरण के लिए, करता है निम्नलिखित कारण एक संघर्ष/त्रुटि:

public class Widget { 
    @Inject private Dep one; 

    private Dep two; 

    // Dep one already injected as a field! 
    @Inject public Widget(Dep one, Dep two) { 
     // ... 
    } 
} 

अग्रिम धन्यवाद!

उत्तर

0

आपकी धारणाएं सही हैं। मेरा मानना ​​है कि इस विशेष मामले में गुइस one दो बार इंजेक्ट करेगा - एक बार कन्स्ट्रक्टर के माध्यम से, एक बार मैदान के माध्यम से - यदि कुछ और नहीं, क्योंकि यह नहीं पता कि वे एक ही क्षेत्र में जा रहे हैं।

19

गुइस हमेशा @Inject के साथ एनोटेटेड सभी फ़ील्ड, विधियों और किसी भी कन्स्ट्रक्टर को इंजेक्ट करेगा। ध्यान रखें कि निर्माता हमेशा पहले इंजेक्शन लेता है, इसलिए आपका एनोटेटेड फ़ील्ड वास्तव में उस इंजेक्शन को ओवरराइट कर देगा। इस संशोधित उदाहरण लें:

[email protected] 
[email protected] 

जाहिर है दो अलग अलग वस्तुओं:

class Widget { 
    @Inject 
    private Dep one; 

    @Inject 
    public Widget(Dep one) { 
     this.one = one; 
     System.out.println(one); 
    } 

    public void printDependency() { 
     System.out.println(one); 
    } 
} 

class Dep {} 

public class MyMain { 
    public static void main(String[] args) { 
     Injector i = Guice.createInjector(); 
     i.getInstance(Widget.class).printDependency(); 

    } 
} 

जब चलाने के लिए, यह कुछ इस तरह का उत्पादन करेगा। पहली पंक्ति निर्माता है; दूसरा क्षेत्र इंजेक्शन है।

मुझे गुइस कोड नमूने लिखते समय शब्दकोष को कम करने के अलावा अक्सर फील्ड इंजेक्शन के लिए उपयोग नहीं मिला है। उत्पादन कोड में यह मूर्खतापूर्ण है क्योंकि यह कोड को परीक्षण करना मुश्किल बनाता है।

+0

गुइस हमेशा प्रत्येक निर्भरता का एक नया उदाहरण बनाएगा जो इसे इंजेक्ट करता है जब तक कि यह कुछ अन्य बाध्यकारी न हो, जैसे सिंगलटन। – logan

+0

क्या आप समझा सकते हैं कि यह परीक्षण के लिए अच्छा क्यों नहीं है? – suitianshi

+0

इस मामले में इंजेक्शन वाले फ़ील्ड निजी हैं, जो उन्हें प्रतिबिंब जैसे कुछ उपयोग किए बिना एक्सेस करना मुश्किल बनाता है। –