web-dev-qa-db-fra.com

Spring injecte des dépendances dans le constructeur sans l'annotation @Autowired

J'expérimente avec des exemples de ce printemps officiel tutoriels et il existe une dépendance à ce code:
https://github.com/spring-guides/gs-async-method/tree/master/complete

Si vous regardez le code sur la classe AppRunner.Java, j'ai 2 problèmes:

1) Lorsque le serveur démarre, si je mets un point d'arrêt dans le constructeur de cette classe, il semble que dans le constructeur, GitHubLookupService est fourni par spring, en utilisant @Service bean configuré. MAIS, il n'y avait pas @Autowired annotation sur le constructeur, comment se fait-il alors que ce constructeur soit appelé avec la bonne dépendance? C'était supposé être null.

Est-ce une hypothèse automatique de Spring Boot ?
Spring voit-il "l'argument champ privé + constructeur, et suppose-t-il qu'il doit rechercher un bean approprié?"
Est-ce Spring Framework ou Spring Boot ?
Est-ce que je manque quelque chose?

2) Si je me souviens bien, il était impératif de fournir constructeur par défaut aux beans/service, etc. Pourquoi cette classe (AppRunner) n'a-t-elle pas de constructeur par défaut? Comment Spring sait-il qu'il doit exécuter le constructeur avec l'argument? Est-ce parce que c'est le seul constructeur?

45
winter

À partir de Spring 4.3 , si une classe configurée comme bean Spring a un seul constructeur, l'annotation Autowired peut être omitted et Spring utilisera ce constructeur et injectera toutes les dépendances nécessaires.

Concernant le constructeur par défaut : vous avez besoin du constructeur par défaut, d'un constructeur avec l'annotation Autowired lorsque vous avez plusieurs constructeurs, ou d'un seul constructeur de votre classe avec ou sans l'annotation Autowired.

Lisez le chapitre "@ Autowired" de la documentation officielle de Spring pour plus d'informations.

98
dunni