Dov’è dovrebbe andare l’annotazione @Autowired – sulla proprietà o sul metodo?

Qual è più corretto?

Questo (con l’annotazione @Autowired sul metodo)?

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

Questo (con l’annotazione @Autowired sulla proprietà)?

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

Dov’è l’annotazione @Autowired che dovrebbe andare?

Secondo Javadoc per Autowired , l’annotazione può essere usata su “un costruttore, un campo, un metodo setter o un metodo di configurazione”. Vedi la documentazione completa per maggiori dettagli.

Personalmente preferisco la tua prima opzione (iniezione del costruttore), perché il campo myDao può essere contrassegnato come finale:

 @Controller public class MyControllear { private final MyDao myDao; @Autowired public MyController(MyDao myDao) { this.myDao = myDao; } 

L’iniezione del costruttore consente anche di testare la class in un test unitario senza codice che dipende da Spring.

La seconda opzione sarebbe meglio scritta come:

 @Controller public class MyControllear { @Autowired private MyDao myDao; MyController() { } 

Con l’iniezione sul campo, Spring crea l’object, quindi aggiorna i campi contrassegnati per l’iniezione.

Un’opzione che non hai menzionato era mettere @Autowired su un metodo setter (setter injection):

 @Controller public class MyControllear { private MyDao myDao; MyController() { } @Autowired public void setMyDao(MyDao myDao) { this.myDao = myDao; } 

Non devi scegliere l’uno o l’altro. È ansible utilizzare l’inserimento sul campo per alcune dipendenze e l’iniezione del costruttore per gli altri per lo stesso object.

L’annotazione va con la proprietà, perché è ciò che viene autowired; la proprietà da impostare automaticamente. Questo tutorial ha un bell’esempio. Questo esempio più avanzato mostra come usare qualificatori per disambiguare il cablaggio.