Что такое Spring, эквивалентный FactoryModuleBuilder, @AssistedInject и @Assisted в Guice?
Что эквивалентно Spring Framework FactoryModuleBuilder
, @AssistedInject
, а также @Assisted
в Google Guice? Другими словами, каков рекомендуемый подход с использованием Spring для создания фабричных объектов, чьи методы принимают аргументы, которые должно предоставлять приложение (а не контейнер)?
Метод статической фабрики Spring не такой как FactoryModuleBuilder
, FactoryModuleBuilder
создает модуль Guice, который генерирует "фабрики", которые реализуют шаблон метода фабрики. В отличие от статического метода фабрики Spring, методы этих объектов фабрики являются методами экземпляра, а не статическими. Проблема со статическим фабричным методом заключается в том, что он статический и не реализует интерфейс, поэтому его нельзя заменить альтернативной фабричной реализацией. Разные FactoryModuleBuilder
экземпляры, однако, могут создавать разные фабрики, которые реализуют один и тот же интерфейс.
2 ответа
Весна не имеет эквивалента Guice FactoryModuleBuilder
, Ближайшим эквивалентом будет весна @Configuration
класс, предоставляющий фабричный компонент, реализующий фабричный интерфейс, методы которого принимают произвольные аргументы из приложения. Контейнер Spring может внедрить зависимости в @Configuration
Объект, который он, в свою очередь, мог бы предоставить фабричному конструктору. В отличие от FactoryModuleBuilder
При использовании Spring-метода создается много стандартного кода, типичного для заводских реализаций.
Пример:
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);
}
};
}
}
Я не совсем уверен, что этот вопрос - обман, (уверен только на 90%), но этот ответ:
Кажется, есть нужная вам информация. В частности, вы должны сделать это:
Я получил его с помощью извлечения экземпляра bean-компонента, используемого в конструкторе-аргументе, из контекста, а затем заполнения его значениями, с которыми вы работаете во время выполнения. Этот bean-компонент будет использоваться в качестве параметра при получении фабрично-сгенерированного bean-компонента.
public class X {
public void callFactoryAndGetNewInstance() {
User user = context.getBean("user");
user.setSomethingUsefull(...);
FileValidator validator = (FileValidator)context.getBean("fileValidator");
...
}
}
Я рекомендую прочитать весь ответ.