2015-04-10 6 views
10

Co to jest Spring Framework równoważne z FactoryModuleBuilder, @AssistedInject i @Assisted w Google Guice? Innymi słowy, jakie jest zalecane podejście, używając Spring do tworzenia obiektów fabrycznych, których metody akceptują argumenty, które musi dostarczyć aplikacja (nie kontener)?Co to jest odpowiednik Spring w FactoryModuleBuilder, @AssistedInject i @Assisted w Guice?

Metoda statycznej sprężyny sprężynowej to nie to samo co FactoryModuleBuilder. FactoryModuleBuilder tworzy moduł Guice, który generuje "fabryki", które implementują Factory Method Pattern. W przeciwieństwie do metody statycznej fabryki Spring, metody tych obiektów fabrycznych są metodami instancyjnymi, a nie statycznymi. Problem z metodą statycznej fabryki polega na tym, że jest statyczny i nie implementuje interfejsu, więc nie można go zastąpić alternatywną implementacją fabryczną. Różne instancje FactoryModuleBuilder mogą jednak budować różne fabryki, które implementują ten sam interfejs.

+0

możliwe duplikat [parametry sprężyna, a przejście do fabrycznych sposób w czasie pracy] (http://stackoverflow.com/questions/6784960/spring-and-passing-parameters-to- method-in-runtime) – durron597

Odpowiedz

4

Wiosna nie ma odpowiednika Guice FactoryModuleBuilder. Najbliższym odpowiednikiem będzie klasa Spring @Configuration, która zapewnia komponent bean fabrycznej, który implementuje interfejs fabryczny, którego metody akceptują dowolne argumenty z aplikacji. Pojemnik Spring mógłby wstrzyknąć zależności obiektowi @Configuration, który z kolei mógłby dostarczyć konstruktorowi fabrycznemu. W przeciwieństwie do wersji FactoryModuleBuilder, podejście sprężynowe generuje wiele kodów standardowych, typowych dla wdrożeń fabrycznych.

przykład:

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

nie jestem całkowicie pewien, że to pytanie jest dupe, (tylko 90% pewien), ale ta odpowiedź:

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

wydaje się potrzebne informacje. W szczególności powinieneś to zrobić:

Mam to działa poprzez pobranie instancji komponentu bean używanego w konstruktorze-arg poza kontekst, a następnie zapełnienie go wartościami, z którymi pracujesz w czasie wykonywania. . Ten komponent bean będzie wówczas używany jako parametr, gdy otrzymasz komponent generowany przez producenta.

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

Polecam czytanie całą odpowiedź.

+0

Ta odpowiedź odnosi się do statycznej metody fabrycznej, która nie jest taka sama jak fabryka, która generuje 'FactoryModuleBuilder'. –

Powiązane problemy