Ich habe es mit einer Legacy-Code-Basis zu tun, wo eine Klasse, die im Frühjahr nicht verdrahtet ist, eine Klasse erhalten muss, die im Frühjahr verdrahtet ist. Ich hatte gehofft, eine Factory-Klasse zu erstellen, die beim Start verdrahtet wurde, und dann konnte ich einfach die Methode getInstance () aufrufen, um ein verdrahtetes Objekt zu erhalten. Was ist der beste Weg, um dies zu tun?
Beispiel:
%Vor%Ich brauche FooFactory beim Start verdrahtet werden, so dass LegacyA einfach nennen getInstance (), so dass es eine Instanz von Foo (die auch im Anwendungskontext definierte eine Bohne ist) zurück.
%Vor%Edit: Ich musste mein Beispiel ein wenig nacharbeiten, da ich es in meinem eigenen Kopf etwas verwirrt habe ...
Die Verwendung von Statiken wie dieser geht wirklich gegen den Strich von Spring IoC, aber wenn Sie haben , um sie zu benutzen, würde ich vorschlagen, einen einfachen Spring Hook zu schreiben, der Foo
übernimmt und injiziert in die FooFactory
, zB
Und in Ihrem XML:
%Vor% Sie müssen Foo
oder FooFactory
Definiert die Bean als Singleton im Frühjahr Konfiguration der Verwendung hier? Sie können es dann in LegacyB
einfügen, indem Sie property oder constructor inject verwenden (meine Präferenz ist letzteres) und dann ist nur die eine Instanz verfügbar.
BEARBEITEN: Re. Deine veränderte Frage (!) Ich bin mir nicht sicher, warum Du Foo nicht einfach wieder als Singleton in Deine Fabrik spritzt. Beachten Sie auch, dass Sie die Methode getInstance()
über die Spring-Konfigurationen verwenden können, indem Sie factory-method und die Injektion über alle Klassen aufrechterhalten.
Zusätzlich zu skaffmans Antwort müssen Sie sehr sorgfältig auf die Reihenfolge der Initialisierung achten.
Bei der Verwendung von Spring-Beans wird nur das Framework automatisch die richtige Reihenfolge der Initialisierung herausfinden. Sobald du jedoch Singleton-Tricks machst, kann das brechen, wenn du nicht vorsichtig bist.
Mit anderen Worten: Stellen Sie sicher, dass LegacyA nicht ausgeführt werden kann, bevor der Anwendungskontext geladen wurde.