Vererbung Using @Autowired in Abstract Classes

lusitano

Aktives Mitglied
Nabend zusammen.

Laut diesem Guide https://www.baeldung.com/spring-autowired-abstract-class müsste ich die Annotation in der Kindsklassen schreiben wie folgendes beispiel zeigt.

Java:
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);
    }
}

Das funktioniert aber bei mir nicht mehr wenn die Elternklasse mehrere Attribute besitzt.
Statt dessen habe ich es wie folgt realisiert.

Java:
public abstract class Anwender {

    private String vorname;
    private String nachname;

    private AnwenderRechte anwenderRechte;

    public Anwender(String vorname, String nachname, AnwenderRechte anwenderRechte) {
        super();
        this.vorname = vorname;
        this.nachname = nachname;
        this.anwenderRechte = anwenderRechte;
    }
   
@Component
public class Bearbeiter extends Anwender {

    public Bearbeiter(String vorname, String nachname, @Autowired AnwenderRechte anwenderRechte) {
        super(vorname, nachname, anwenderRechte);
        // TODO Auto-generated constructor stub
    }

Es funktioniert so.
Die frage wäre. Kann man das so machen ? Wird es so gemacht oder wie macht man das genau ??

Liebe Grüße und schon mal Danke für eure Antworten.
 
Die Antwort steht doch auf der Seite: "Third, as Spring doesn't support constructor injection in an abstract class, we should generally let the concrete subclasses provide the constructor arguments. This means that we need to rely on constructor injection in concrete subclasses."
 
Java:
public abstract class Anwender {
@Component
public class Bearbeiter extends Anwender {
    public Bearbeiter(String vorname, String nachname, @Autowired AnwenderRechte anwenderRechte) {
        super(vorname, nachname, anwenderRechte);
    }
    ...
}
Auch macht es keinen Sinn, die @Autowired Annotation an einen Konstruktorparameter zu hängen. Wo sollen denn dann noch die restlichen Parameter "vorname" und "nachname" herkommen, wenn Spring die Instanz der Klasse erzeugt?
Siehe: https://docs.spring.io/spring-frame...ework/beans/factory/annotation/Autowired.html
Autowired Parameters
Although @Autowired can technically be declared on individual method or constructor parameters since Spring Framework 5.0, most parts of the framework ignore such declarations. The only part of the core Spring Framework that actively supports autowired parameters is the JUnit Jupiter support in the spring-test module (see the TestContext framework reference documentation for details).
 
Das Autowired sollte auch nicht an den Parameter, sondern an den Konstruktor. Am Parameter wird das in dem Fall ignoriert.


Soll Bearbeiter wirklich eine Componente sein? Das sieht erstmal wie ein ganz normales Objekt aus, was nicht unbedingt als singleton bereit stehen sollte...
 

Zurück
Oben