Spring und Übergabe der Parameter an die Factory-Methode zur Laufzeit

7

Die Dokumentation der Methode context.getBean (Name, Benutzer) sagt

  

Ermöglicht die explizite Angabe von Konstruktorargumenten / Factory-Methode   Argumente

aber egal was ich mache (alles versucht), mit der logischsten Einstellung bekomme ich das, wenn die Beans während der Initialisierung geladen werden:

%Vor% %Vor% %Vor%

Der Kommentar sagt, dass Sie es tun können, aber wenn Sie Konstruktorargumente in der xml-Definition dieser Bean angeben, schlägt es fehl.

    
lisak 22.07.2011, 02:05
quelle

4 Antworten

15

Die javadoc sagt:

  

args - Argumente, die verwendet werden sollen, wenn ein Prototyp mit expliziten Argumenten für eine statische Factory-Methode erstellt wird.

Also muss die Bean-Definition eine prototypspezifische Bean sein, d. h.

%Vor%     
skaffman 22.07.2011, 06:37
quelle
10

Beim Lesen von 20 Posts stellte ich fest, dass es nicht offensichtlich war, wie eine benutzerdefinierte Factory-Methode zur Laufzeitparameter abgerufen werden kann, insbesondere da wir gezwungen sind, die Konstruktor-arg-Tags zu verwenden und auf eine vorhandene Bean in der Kontext als Setup unten und die betreffende Klasse als eine statische Factory-Methode.

%Vor%

Ich habe es geschafft, indem ich eine Instanz der im Konstruktor-arg verwendeten Bean aus dem Kontext heraushole und sie dann mit den Werten bevölkere, mit denen Sie zur Laufzeit arbeiten. Diese Bean wird dann als Parameter verwendet, wenn Sie Ihre fabrikgenerierte Bean erhalten.

%Vor%

Beachten Sie, dass dies nicht das Problem löst, das mit context.getBean (arg1, arg2) gestellt wird, da diese Methode in diesem Szenario nicht relevant ist. Der Grund dafür ist, dass all diese Beans Singleton sind und der Konstruktor zu diesem Zeitpunkt nicht aufgerufen wird. Kein Problem und nichts, worüber Sie sich Sorgen machen müssen, wenn Sie in einem Einzelbenutzersystem arbeiten, da Sie sowieso immer nur eine User-Bean in Ihrem Kontext haben!

Bei einem System mit mehreren Benutzern müssen Sie jedoch sicherstellen, dass Sie eine eindeutige User-Bean für jeden echten Benutzer haben und dass Sie die korrekte User-Bean im Aufruf der Factory-Methode verwenden.

Um dies in einem Mehrbenutzersystem zu tun, müssen Sie die Bean-Typen als Prototyp ändern UND Sie sollten eine Bean Ihres FileValidators erstellen, die die Factory darstellt (wenn Sie eine Abhängigkeitsinjektion in die Factory planen). und ein weiterer Bean FileValidator, der Ihre neue Instanz darstellt. Sie werden beide vom gleichen Klassentyp sein, aber Sie müssen jedem einen eindeutigen Namen geben. Siehe unten:

%Vor%

und in der Klasse, in der Sie diese neue FileValidator-Bean ab Werk erhalten möchten, können Sie die folgende Technik verwenden:

%Vor%     
gannable 06.11.2012 01:22
quelle
7

Um die Factory-Methode aufzurufen, benötigt Spring Zugriff auf eine Benutzerinstanz, die an createInstance übergeben wird. In diesem Fall erstelle ich einfach eine Bean und gebe sie ein:

%Vor%     
alexwen 22.07.2011 06:24
quelle
6

Sie können auch eine abstrakte Factory verwenden, indem Sie das Attribut "factory-bean" setzen. Hier haben wir eine ActionFactory, die Aktionen erstellt.

%Vor%

Um diese Konfiguration zu verwenden, müssen Sie folgende Punkte berücksichtigen:

  1. create-Methode ist nicht statisch. Gehört jetzt zu einer Instanz
  2. constructor-arg ist der Parameter der Factory-Methode
yeraycaballero 19.01.2012 13:38
quelle

Tags und Links