2012-04-13 17 views
21

Ich benutze Spring seit ein paar Monaten für jetzt, und ich dachte, Abhängigkeitsinjektion mit der @Autowired Annotation benötigt auch einen Setter für das Feld zu injizieren.Spring Abhängigkeitsinjektion @Autowired ohne Setter

Also, Ich benutze es wie folgt aus:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

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

    ... 

}

Aber ich habe das heute versucht:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    ... 

}

Und oh Überraschung, nein Übersetzungsfehler, keine Fehler beim Start, die Anwendung läuft einwandfrei ...

Also meine Frage ist, ist der Setter für die Abhängigkeitsinjektion mit der @Autowired Annotation erforderlich?

Ich verwende Spring 3.1.1.

+3

Scheint, als ob Sie Ihre eigene Frage beantwortet haben. – darrengorman

Antwort

35

Sie benötigen keinen Setter mit dem @Autowired, der Wert wird durch Reflexion festgelegt.

prüfen Diesen Beitrag für eine vollständige Erklärung How does Spring @Autowired work

+0

Danke für die schnelle Antwort! – Tony

+0

Vergessen Sie nicht, den verlinkten Beitrag hochzuladen;) –

+0

Feld kann privat sein und Spring Autowired funktioniert auch ohne Setter. – chalimartines

3

Nein, wenn Java-Sicherheitspolitik Frühling die Zugriffsrechte für das Paket geschützten Bereich ein Setter ändern können ist nicht erforderlich.

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()); 

    } 
} 

Dies ist, wie es mit Reflektion getan wird.

Verwandte Themen