Что такое 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%), но этот ответ:

/questions/31877808/spring-i-peredacha-parametrov-fabrichnomu-metodu-vo-vremya-vyipolneniya/31877821#31877821

Кажется, есть нужная вам информация. В частности, вы должны сделать это:

Я получил его с помощью извлечения экземпляра bean-компонента, используемого в конструкторе-аргументе, из контекста, а затем заполнения его значениями, с которыми вы работаете во время выполнения. Этот bean-компонент будет использоваться в качестве параметра при получении фабрично-сгенерированного bean-компонента.

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

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

Другие вопросы по тегам