2015-04-10 1 views
10

Was ist das Spring Framework entspricht FactoryModuleBuilder, @AssistedInject und @Assisted in Google Guice? Mit anderen Worten: Was ist der empfohlene Ansatz, Spring zu verwenden, um Factory-Objekte zu erstellen, deren Methoden Argumente akzeptieren, die die Anwendung (nicht der Container) bereitstellen muss?Wie lautet das Spring-Äquivalent zu FactoryModuleBuilder, @AssistedInject und @Assisted in Guice?

Die statische Fabrik-Spring-Methode ist nicht das Gleiche wie FactoryModuleBuilder. FactoryModuleBuilder erstellt ein Guice-Modul, das "Fabriken" generiert, die die Factory Method Pattern implementieren. Im Gegensatz zu einer statischen Spring Factory-Methode sind die Methoden dieser Factory-Objekte Instanzmethoden, keine statischen Methoden. Das Problem bei einer statischen Factory-Methode besteht darin, dass sie statisch ist und keine Schnittstelle implementiert, sodass sie nicht durch eine alternative Factory-Implementierung ersetzt werden kann. Verschiedene FactoryModuleBuilder Instanzen können jedoch verschiedene Fabriken erstellen, die die gleiche Schnittstelle implementieren.

+0

möglich Duplikat [Frühling und Übergabe von Parametern auf Werks-Methode zur Laufzeit] (http://stackoverflow.com/questions/6784960/spring-and-passing-parameters-to- factory-method-in-runtime) – durron597

Antwort

4

Feder hat keine Entsprechung zum Guice FactoryModuleBuilder. Die nächste Entsprechung wäre eine Spring-Klasse , die eine Factory-Bean bereitstellt, die eine Factory-Schnittstelle implementiert, deren Methoden beliebige Argumente von der Anwendung akzeptieren. Der Spring-Container könnte Abhängigkeiten in das -Objekt einfügen, das es wiederum an den Factory-Konstruktor liefern könnte. Im Gegensatz zu FactoryModuleBuilder erzeugt der Spring-Ansatz eine Menge Standardcode, der für Factory-Implementierungen typisch ist.

Beispiel:

public class Vehicle { 
} 

public class Car extends Vehicle { 
    private final int numberOfPassengers; 

    public Car(int numberOfPassengers) { 
     this.numberOfPassengers = numberOfPassengers; 
    } 
} 

public interface VehicleFactory { 
    Vehicle createPassengerVehicle(int numberOfPassengers); 
} 

@Configuration 
public class CarFactoryConfiguration { 
    @Bean 
    VehicleFactory carFactory() { 
     return new VehicleFactory() { 
      @Override 
      Vehicle createPassengerVehicle(int numberOfPassengers) { 
       return new Car(numberOfPassengers); 
      } 
     }; 
    } 
} 
0

Ich bin nicht ganz sicher, dass diese Frage ist ein Betrogene, (nur 90% sicher), aber diese Antwort:

https://stackoverflow.com/a/13243066/1768232

Scheint die Informationen, die Sie benötigen. Insbesondere sollten Sie dies tun:

habe ich es funktioniert, indem eine Instanz der Bohne Abrufen verwendet in der Konstruktor-Arg- aus dem Kontext und dann mit den Werten bevölkern, die Sie mit arbeiten zur Laufzeit . Diese Bean wird dann als Parameter verwendet, wenn Sie Ihre fabrikgenerierte Bean erhalten.

public class X { 
    public void callFactoryAndGetNewInstance() { 
     User user = context.getBean("user"); 
     user.setSomethingUsefull(...); 
     FileValidator validator = (FileValidator)context.getBean("fileValidator"); 
     ... 
    } 
} 

Ich empfehle die gesamte Antwort zu lesen.

+0

Diese Antwort bezieht sich auf eine statische Factory-Methode, die nicht mit einer Factory übereinstimmt, die 'FactoryModuleBuilder' generiert. –

Verwandte Themen