2015-04-10 10 views
10

Qual è lo Spring Framework equivalente a FactoryModuleBuilder, @AssistedInject e @Assisted in Google Guice? In altre parole, qual è l'approccio raccomandato usando Spring per creare oggetti factory i cui metodi accettano argomenti che l'applicazione (non il contenitore) deve fornire?Qual è l'equivalente Spring di FactoryModuleBuilder, @AssistedInject e @Assisted in Guice?

Il metodo di fabbrica statico di primavera non è lo stesso di FactoryModuleBuilder. FactoryModuleBuilder crea un modulo Guice che genera "fabbriche" che implementano lo Factory Method Pattern. A differenza di un metodo factory statico di Spring, i metodi di questi oggetti factory sono metodi di istanza, non metodi statici. Il problema con un metodo factory statico è che è statico e non implementa un'interfaccia quindi non può essere sostituita con un'implementazione di fabbrica alternativa. Diverse istanze di FactoryModuleBuilder, tuttavia, possono creare diverse fabbriche che implementano la stessa interfaccia.

+0

possibile duplicato del [parametri primavera e di passare alla fabbrica-metodo in fase di esecuzione] (http://stackoverflow.com/questions/6784960/spring-and-passing-parameters-to- factory-method-in-runtime) – durron597

risposta

4

Spring non ha equivalenti a Guice FactoryModuleBuilder. L'equivalente più vicino sarebbe una classe Spring @Configuration che fornisce un bean factory che implementa un'interfaccia factory i cui metodi accettano argomenti arbitrari dall'applicazione. Il contenitore Spring potrebbe iniettare dipendenze nell'oggetto @Configuration che a sua volta potrebbe fornire al costruttore di fabbrica. A differenza di FactoryModuleBuilder, l'approccio Spring produce un sacco di codici standard tipici delle implementazioni di fabbrica.

Esempio:

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

Non sono del tutto sicuro che questa domanda è una vittima, (solo il 90% sicuro), ma questa risposta:

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

Sembra avere le informazioni necessarie. In particolare, si dovrebbe fare questo:

ho ottenuto che funziona per il recupero un'istanza del fagiolo utilizzato nel costruttore-Arg fuori del contesto e poi popolare con i valori che si sta lavorando a run-time . Questo bean verrà quindi utilizzato come parametro quando si ottiene il bean generato in fabbrica.

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

vi consiglio di leggere l'intera risposta.

+0

Questa risposta si riferisce a un metodo factory statico che non è lo stesso di una factory generata da FactoryModuleBuilder'. –

Problemi correlati