Autowire je nach Unterklasse
Ich habe eine abstrakte Klasse AbstractService
die einen Verweis auf AbstractDAO
class AbstractService{
protected AbstractDAO abstractDAO;
}
AbstractService
wird erweitert durch aktuelle service-Klassen, wie ServiceClassA
, ServiceClassB
etc,
und AbstractDAO
wird ergänzt durch DaoClassA
, DaoClassB
etc.
Je nachdem, welche Klasse erweitert AbstractService
, abstractDAO
sollte eine Instanz von DaoClassA
, DaoClassB
etc
Kann ich dies erreichen, indem er die abstractDAO setter in der Verlängerung Klasse wie
class ServiceClassA{
@Autowired
@Qualifier("daoClassA")
public void setAbstractDAO(AbstractDAO abstractDAO) {
super.abstractDAO = abstractDAO;
}
}
Gibt es irgendeine Möglichkeit zu haben, den setter setAbstractDAO
im AbstractService
Klasse selbst
und abstractDAO
bekommt Autowired je nach Unterklasse vielleicht wth SPEL+Qualifier etc
Wollen wir gar nicht verwenden keine XML-Konfiguration für dieses
- Gibt es einen Grund, Sie können nicht z.B.
@Autowired DaoClassA dao
inServiceClassA
? Warum wird das Feld muss deklariert werden inAbstractService
? - Gute Frage. Ich habe immer etwas getan, ähnlich dem Ansatz, den Sie beschreiben (etwas anders, aber die gleiche Grundidee) und ich wollte schon immer etwas mehr Automatik. Eager, um zu sehen, ob jemand hier einen guten Ansatz.
- In den Fällen, die ich hatte, wollte ich den AbstractService Zugang zu den AbstractDao so, ich könnte schreiben, Allgemeine Versionen von CRUD-Operationen, unter anderem.
- Gibt es mehrere Implementierungen von AbstractService und wir wollen nicht zu haben, das Feld deklariert in allen Klassen Verlängerung AbstractService
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würde ich es nicht tun wie diese. In der Tat, es gibt eine gute chance, dass die ServiceClassA hängt davon ab, einige spezifische Methode der DaoClassA. In diesem Fall müssten Sie das wirken des geschützten AbstractDAO zu DaoClassA jedes mal, wenn Sie anrufen möchten, wie eine bestimmte Methode.
Ich es machen würde, generic, und in umgekehrter Weise die Abhängigkeiten injiziert werden:
War ich der Lösung ähnliche problem wie du haben. Ich fand einen anderen Weg, Sie müssen nicht zum erstellen von setter-Methoden. Anstelle der Verwendung von regulären Konstruktoren, sondern nutzen den Frühling autowiring. Hier ist der vollständige code:
Service-Klassen:
Bemerken
@Qualifier("daoClassA")
in der Unterklasse KonstruktorenFeld Klassen:
Und endlich, jetzt können Sie rufen Sie Ihren Standarddienst mit konkreten Service-Klasse und der konkreten DAO-Klasse: (natürlich können Sie autowire Sie irgendwo)
drucken:
Nein, gibt es nicht. Sie können nicht Zugriff auf die Klasse oder bean-Namen, die derzeit Auffüllen der
AutowiredAnnotationBeanPostProcessor
aus SPEL.Könnte man überschreiben
AbstractBeanFactory.evaluateBeanDefinitionString
und fügen Sie denbeanDefinition
als variable in derBeanExpressionContext
. Dann kann man die Ableitung der Dao aus dem Dienst. mit SPEL im @Value-annotation.