it-swarm.com.de

Spring fügt Abhängigkeiten in Konstruktoren ohne @Autowired-Annotation ein

Ich experimentiere mit Beispielen aus diesem offiziellen Spring Tutorials und es gibt eine Abhängigkeit von diesem Code:
https://github.com/spring-guides/gs-async-method/tree/master/complete

Wenn Sie sich den Code in der Klasse AppRunner.Java ansehen, treten zwei Probleme auf:

1) Wenn der Server gestartet wird und ich einen Haltepunkt in den Konstruktor dieser Klasse eingefügt habe, wird der GitHubLookupService von spring mithilfe des @ Service Bean, die konfiguriert wurde. ABER es gab kein @Autowired Anmerkung zum Konstruktor, wie in aller Welt wird dieser Konstruktor mit der richtigen Abhängigkeit aufgerufen? Es sollte null sein.

Ist es eine automatische Annahme von Spring Boot ?
Sieht Spring "private field + constructor argument" und geht davon aus, dass es nach einer geeigneten Bean suchen sollte?
Ist es Spring Framework oder Spring Boot ?
Vermisse ich etwas?

2) Wie ich mich erinnere, war es obligatorisch, Standardkonstruktor für Beans/Service usw. bereitzustellen. Warum hat diese Klasse (AppRunner) keinen Standardkonstruktor? Woher weiß Spring, dass er den Konstruktor mit dem Argument ausführen soll? Liegt es daran, dass es der einzige Konstruktor ist?

45
winter

Beginnend mit Spring 4.3 kann die Annotation Autowired sein, wenn eine Klasse, die als Spring Bean konfiguriert ist, nur einen Konstruktor hat weggelassen, und Spring verwendet diesen Konstruktor und fügt alle erforderlichen Abhängigkeiten ein.

In Bezug auf den Standardkonstruktor : Sie benötigen entweder den Standardkonstruktor, einen Konstruktor mit der Annotation Autowired, wenn Sie mehrere Konstruktoren haben, oder nur einen Konstruktor in Ihrer Klasse mit oder ohne die Annotation Autowired.

Lesen Sie das Kapitel "@ Autowired" in der offiziellen Spring-Dokumentation, um weitere Informationen zu erhalten.

98
dunni