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