2012-04-13 13 views
21

मैं अब कुछ महीनों से वसंत का उपयोग कर रहा हूं, और मैंने सोचा कि @Autowired एनोटेशन के साथ निर्भरता इंजेक्शन को भी इंजेक्ट करने के लिए फ़ील्ड के लिए एक सेटटर की आवश्यकता है।वसंत निर्भरता इंजेक्शन @ सेटर के बिना आउटपुट

तो, मैं इसे इस तरह उपयोग कर रहा हूँ:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    public void setMyService(MyService injectedService) { 
     this.injectedService = injectedService; 
    } 

    ... 

}

लेकिन मैं कोशिश की है यह आज:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    ... 

}

और ओह आश्चर्य, कोई संकलन त्रुटियों, स्टार्टअप पर कोई त्रुटि नहीं, एप्लिकेशन पूरी तरह से चल रहा है ...

तो मेरा सवाल यह है कि, @Autowired एनोटेशन के साथ निर्भरता इंजेक्शन के लिए आवश्यक सेटटर है?

मैं वसंत 3.1.1 का उपयोग कर रहा हूं।

+3

ऐसा लगता है कि आपने अपने प्रश्न का उत्तर दिया है। – darrengorman

उत्तर

35

आपको @Autowired के साथ एक सेटटर की आवश्यकता नहीं है, मान प्रतिबिंब द्वारा निर्धारित किया गया है।

चेक पूर्ण विवरण के लिए इस पोस्ट How does Spring @Autowired work

+0

त्वरित उत्तर के लिए धन्यवाद! – Tony

+0

लिंक किए गए पोस्ट को न भूलें;) –

+0

फील्ड निजी और स्प्रिंग ऑटोवायर काम भी सेटटर के बिना हो सकता है। – chalimartines

3

नहीं, अगर जावा सुरक्षा नीति स्प्रिंग पैकेज संरक्षित क्षेत्र एक सेटर की आवश्यकता नहीं है के लिए अधिकारों का उपयोग बदलने के लिए अनुमति देता है।

2
package com.techighost; 

public class Test { 

    private Test2 test2; 

    public Test() { 
     System.out.println("Test constructor called"); 
    } 

    public Test2 getTest2() { 
     return test2; 
    } 
} 


package com.techighost; 

public class Test2 { 

    private int i; 

    public Test2() { 
     i=5; 
     System.out.println("test2 constructor called"); 
    } 

    public int getI() { 
     return i; 
    } 
} 


package com.techighost; 

import java.lang.reflect.Field; 

public class TestReflection { 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
     Class<?> class1 = Class.forName("com.techighost.Test"); 
     Object object = class1.newInstance(); 
     Field[] field = class1.getDeclaredFields(); 
     field[0].setAccessible(true); 
     System.out.println(field[0].getType()); 
     field[0].set(object,Class.forName(field[0].getType().getName()).newInstance()); 
     Test2 test2 = ((Test)object).getTest2(); 
     System.out.println("i="+test2.getI()); 

    } 
} 

इस तरह यह प्रतिबिंब का उपयोग करके किया जाता है।

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