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?
À 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.