web-dev-qa-db-fra.com

Où l'annotation @Autowired est-elle censée aller - sur la propriété ou la méthode?

Quel est le plus correct?

Ceci (avec l'annotation @Autowired sur la méthode)?

@Controller
public class MyController
{
    private MyDao myDao;

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

Ceci (avec l'annotation @Autowired sur la propriété)?

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

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

Où l'annotation @Autowired est-elle censée aller?

31
Thom Wilkie

Selon Javadoc pour Autowired , l'annotation peut être utilisée sur "un constructeur, un champ, une méthode de définition ou une méthode de configuration". Voir la documentation complète pour plus de détails.

Personnellement, je préfère votre première option (injection de constructeur), car le champ myDao peut être marqué comme final:

@Controller
public class MyControllear {
    private final MyDao myDao;

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

L'injection de constructeur vous permet également de tester la classe dans un test unitaire sans code qui dépend de Spring.

La deuxième option serait mieux écrite comme:

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

    MyController() {
    }

Avec l'injection de champs, Spring créera l'objet, puis mettra à jour les champs marqués pour l'injection.

Une option que vous n'avez pas mentionnée était de mettre @Autowired sur une méthode setter (injection setter):

@Controller
public class MyControllear {
    private MyDao myDao;

    MyController() {
    }

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

Vous n'avez pas à choisir l'un ou l'autre. Vous pouvez utiliser l'injection de champs pour certaines dépendances et l'injection de constructeur pour d'autres pour le même objet.

51
NamshubWriter

L'annotation va avec la propriété, car c'est ce qui est câblé automatiquement; la propriété à définir automatiquement. Ce tutoriel a un bel exemple. Cet exemple plus avancé montre comment utiliser les qualificatifs pour lever l'ambiguïté du câblage.

0
dj_segfault