28

Welches ist richtiger?Wohin soll die @Autowired Annotation gehen - auf der Eigenschaft oder der Methode?

Dies (mit der @Autowired Annotation auf der Methode)?

@Controller 
public class MyController 
{ 
    private MyDao myDao; 

    @Autowired 
    public MyController(MyDao myDao) 
    { 
     this.myDao = myDao; 
    } 

Dies (mit der @Autowired Annotation auf der Eigenschaft)?

@Controller 
public class MyController 
{ 
    @Autowired 
    private MyDao myDao; 

    public MyController(MyDao myDao) 
    { 
     this.myDao = myDao; 
    } 

Wohin soll die @Autowired-Annotation gehen?

Antwort

47

Gemäß the Javadoc for Autowired kann die Annotation für "ein Konstruktor, Feld, Setter-Methode oder Config-Methode" verwendet werden. Weitere Informationen finden Sie unter the full documentation.

ich persönlich vorziehen, Ihre erste Option (Konstruktor Injektion), weil das myDao Feld als final markiert werden können:

@Controller 
public class MyControllear { 
    private final MyDao myDao; 

    @Autowired 
    public MyController(MyDao myDao) { 
     this.myDao = myDao; 
    } 

Constructor Injektion können Sie auch ohne Code die Klasse in einer Unit-Test testen, der davon abhängt Frühling.

Die zweite Option wäre besser geschrieben als:

@Controller 
public class MyControllear { 
    @Autowired 
    private MyDao myDao; 

    MyController() { 
    } 

Mit Feldeinkopplung, Frühling das Objekt erstellen, dann aktualisiert die Felder für die Injektion gekennzeichnet.

Eine Option, die Sie nicht erwähnt wurde Putting @Autowired auf einer Set-Methode (Setter Injektion):

@Controller 
public class MyControllear { 
    private MyDao myDao; 

    MyController() { 
    } 

    @Autowired 
    public void setMyDao(MyDao myDao) { 
     this.myDao = myDao; 
    } 

Sie haben noch den einen oder anderen zu wählen. Sie können die Feldinjektion für einige Abhängigkeiten und die Konstruktorinjektion für andere für dasselbe Objekt verwenden.

+2

Nach einem Experiment, das ich gerade gemacht habe (mit Spring 3.0), kann das Feld auch in der zweiten Option als "final" markiert werden, dh es scheint gut zu funktionieren, @Autowired auf ein letztes Feld zu setzen und die Verkabelung funktioniert tatsächlich zur Laufzeit! Ich nehme an, es funktioniert, weil Spring den "finalen" Modifikator umgeht, wenn es das Feld durch Reflexion setzt. Kann jemand etwas mehr Licht darin bestätigen/leuchten? –

+0

@Mikko Ich bin überrascht, dass das funktioniert. Der "final" -Modifikator bietet einige Garantien für die Parallelität. Wenn Spring die endgültigen Felder nach der Konstruktion ändert, verlieren Sie einige dieser Vorteile. – NamshubWriter

0

Die Annotation gehört zur Eigenschaft, weil sie autowired ist; Die Eigenschaft, die automatisch festgelegt wird. This tutorial hat ein schönes Beispiel. This more advanced example zeigt, wie Qualifizierer verwendet werden können, um die Verdrahtung zu disambiguieren.

Verwandte Themen