Что такое 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");
      ...
   }
}

Я рекомендую прочитать весь ответ.