Verwenden von @Autowired in abstrakten Klassen

1. Einleitung

In diesem kurzen Tutorial erklären wir, wie die Annotation @Autowired in abstrakten Klassen verwendet wird.

Wir werden @Autowired auf eine abstrakte Klasse anwenden und uns auf die wichtigen Punkte konzentrieren, die wir berücksichtigen sollten.

2. Setter-Injektion

Wir können @Autowired für eine Setter-Methode verwenden:

public abstract class BallService { private LogRepository logRepository; @Autowired public final void setLogRepository(LogRepository logRepository) { this.logRepository = logRepository; } }

Wenn wir @Autowired für eine Setter-Methode verwenden, sollten wir das Schlüsselwort final verwenden , damit die Unterklasse die Setter-Methode nicht überschreiben kann . Andernfalls funktioniert die Anmerkung nicht wie erwartet.

3. Konstruktorinjektion

Wir können @Autowired nicht für einen Konstruktor einer abstrakten Klasse verwenden.

Spring wertet die Annotation @Autowired für einen Konstruktor einer abstrakten Klasse nicht aus. Die Unterklasse sollte dem Superkonstruktor die erforderlichen Argumente liefern .

Stattdessen sollten wir @Autowired für den Konstruktor der Unterklasse verwenden:

public abstract class BallService { private RuleRepository ruleRepository; public BallService(RuleRepository ruleRepository) { this.ruleRepository = ruleRepository; } }
@Component public class BasketballService extends BallService { @Autowired public BasketballService(RuleRepository ruleRepository) { super(ruleRepository); } }

4. Spickzettel

Lassen Sie uns ein paar Regeln zusammenfassen, an die Sie sich erinnern sollten.

Erstens wird eine abstrakte Klasse nicht von Komponenten gescannt, da sie ohne eine konkrete Unterklasse nicht instanziiert werden kann.

Zweitens ist die Setter-Injection in einer abstrakten Klasse möglich , aber es ist riskant, wenn wir nicht das endgültige Schlüsselwort für die Setter-Methode verwenden. Die Anwendung ist möglicherweise nicht stabil, wenn eine Unterklasse die Setter-Methode überschreibt.

Drittens, da Spring die Konstruktorinjektion in einer abstrakten Klasse nicht unterstützt, sollten wir im Allgemeinen die konkreten Unterklassen die Konstruktorargumente bereitstellen lassen . Dies bedeutet, dass wir uns auf die Konstruktorinjektion in Betonunterklassen verlassen müssen .

Und schließlich ist die Verwendung der Konstruktorinjektion für erforderliche Abhängigkeiten und der Setterinjektion für optionale Abhängigkeiten eine gute Faustregel. Wie wir jedoch bei einigen Nuancen mit abstrakten Klassen sehen können, ist die Konstruktorinjektion hier im Allgemeinen günstiger .

Wir können also wirklich sagen, dass eine konkrete Unterklasse regelt, wie ihr abstraktes übergeordnetes Element seine Abhängigkeiten erhält . Die Feder führt die Injektion durch, solange die Feder die Unterklasse verdrahtet.

5. Schlussfolgerung

In diesem Artikel haben wir die Verwendung von @Autowired in einer abstrakten Klasse geübt und einige, aber wichtige Schlüsselpunkte erläutert.

Der Quellcode dieses Tutorials befindet sich wie gewohnt im Github-Projekt.