Wie wird Spring Autowired (oder manuell verdrahtet) im Scala-Objekt verwendet?

7

Ich versuche Spring mit Scala zu benutzen. Ich weiß, dass Autowired mit der Scala-Klasse arbeitet, aber ich benutze ein Web-Framework, das ein Objekt benötigt, und ich möchte ein Dao in es einfügen. Ich frage mich, wie das geht? Sorry, ich bin ziemlich neu in Scala, vielen Dank im Voraus.

%Vor%     
bernardw 01.12.2011, 15:54
quelle

5 Antworten

12

Grundsätzlich haben Sie zwei Probleme:

  • Eigenschaft sollte veränderbar sein, d. h. var anstatt val

  • Alle Methoden von Scala object sind static , während Spring Instanzmethoden erwartet. Eigentlich erstellt Scala eine Klasse mit Instanzmethoden namens UserRest$ hinter der Szene, und Sie müssen seine Singleton-Instanz UserRest$.MODULE$ für Spring verfügbar machen.
    Spring kann Konfigurationen auf bereits vorhandene Singleton-Instanzen anwenden, sie sollten jedoch von einer Methode zurückgegeben werden, während UserRest$.MODULE$ ein Feld ist. Daher müssen Sie eine Methode zum Zurückgeben erstellen.

Also sollte so etwas funktionieren:

%Vor%

.

%Vor%

Sie können <property> durch @Autowired ersetzen, aber die manuelle Bean-Deklaration nicht durch @Service ersetzen, da Probleme mit der oben beschriebenen Singleton-Instanz auftreten.

Siehe auch:

axtavt 01.12.2011, 16:09
quelle
4

Alles, was wirklich notwendig ist, ist, dass Sie Ihr Objekt als eine Klasse und nicht als ein Objekt definieren. So wird Spring es instanziieren.

%Vor%

Das Ändern von "val" in "var" ist nicht notwendig (Spring verwendet Reflektion, die Unveränderlichkeit ignoriert). Ich bin mir ziemlich sicher, dass diese @BeanProperty auch nicht notwendig ist (Spring wird dem zugrunde liegenden Feld reflektiv zuweisen).

    
Dave Griffith 02.12.2011 02:04
quelle
3

axtavts Lösung hat bei mir nicht funktioniert, aber die verschiedenen Vorschläge aus den anderen Antworten zu kombinieren, halte ich für die eleganteste Lösung:

%Vor%

Einige Anmerkungen:

  • Die Verwendung von @Configuration stellt sicher, dass Ihre Begleitobjekte eifrig autowired werden
  • Die Verwendung von @Bean def vermeidet es, mit lauten Namen umzugehen, die Scala der Klasse gibt, die das Companion-Objekt
  • implementiert
  • val funktioniert ganz gut, wie von Dave Griffith
  • erwähnt
  • es gibt keine Notwendigkeit für Scala @BeanProperty, Spring versteht Scala-Eigenschaften sofort (ich benutze 3.2.2)
Yuri Shkuro 23.09.2013 00:05
quelle
1

Ich verwende AutowiredAnnotationBeanPostProcessor, um das Objekt zur Konstruktionszeit zu injizieren.

Zum Beispiel:

%Vor%

Jetzt können Sie AppConfig.inject () verwenden, um Objekte einzufügen, deren Lebenszyklus nicht von Spring gesteuert wird. Zum Beispiel JPA Entities, etc.

    
sourcedelica 01.12.2011 16:45
quelle
0

Zusätzlich zu Ссылка ist es auch möglich, das scala Paketobjekt zum Spring-Kontext hinzuzufügen sowie scala object mit der Factory-Methode. Kompiliertes Paketobjekt ist die übliche Java-Klasse mit dem Namen package , sodass Sie es zum Spring-Kontext hinzufügen können. Danach haben Sie alle Möglichkeiten von Spring in diesem Objekt, zB @Autowired , @Value , manuelle Verdrahtung usw.

Testpaket:

%Vor%

Und der Quellkontext xml ist:

%Vor%     
Anton Ermakov 13.11.2015 15:24
quelle

Tags und Links