Ich habe mehrere Dienste, die eine gemeinsame Schnittstelle implementieren, und ich möchte in der Lage sein, eine davon auszuwählen, um sie in andere Dienste zu injizieren, wenn meine Anwendung gestartet wird.
Ich habe versucht, die Service-Implementierung von resources.groovy wie unten gezeigt zu referenzieren, aber dann macht Spring eine neue Instanz des ausgewählten Service und ordnet seine Abhängigkeiten nicht automatisch an.
Wie kann ich diese Lösung zum Laufen bringen? Oder gibt es einen anderen Weg?
%Vor%resources.groovy:
%Vor%Es ist natürlich möglich, den Verweis auf den Service von einer handgebauten Fabrik abzurufen, aber meiner Meinung nach ist der Ansatz, den Sie gewählt haben, der beste. Ich benutze es selbst, weil es alle Informationen zur Konfigurationsphase der Anwendung an einem Ort sammelt, so dass es einfacher ist, herauszufinden, welche Implementierung verwendet wird.
Die Fallstricke mit Autowinding, denen Sie begegnet sind, können sehr leicht erklärt werden. Alle Klassen in grails-app/services
werden automatisch von Grails als Spring-Singleton-Beans mit Autowire-Namen konfiguriert. Daher erstellt die Bean-Definition, die Sie in grails-app/conf/resources.groovy
platziert haben, eine andere Bean, jedoch ohne die durch Grails-Konventionen festgelegten Standardwerte.
Die einfachste Lösung besteht darin, die Implementierung in src/groovy
zu setzen, um doppelte Beans zu vermeiden, und die folgende Syntax zu verwenden, um das Autowiring zu aktivieren: