Spring Framework中与FactoryModuleBuilder
,@AssistedInject
和@Assisted
相当的Google Guice是什么?换句话说,使用Spring创建工厂对象的建议方法是什么,其方法接受应用程序(而不是容器)必须提供的参数?
Spring静态工厂方法与FactoryModuleBuilder
不同。 FactoryModuleBuilder
构建一个Guice模块,用于生成"工厂"实现Factory Method Pattern。与Spring静态工厂方法不同,这些工厂对象的方法是实例方法,而不是静态方法。静态工厂方法的问题在于它是静态的并且不实现接口,因此不能用替代工厂实现替换它。但是,不同的FactoryModuleBuilder
实例可以构建实现相同接口的不同工厂。
答案 0 :(得分:5)
Spring与Guice FactoryModuleBuilder
无关。最接近的等价物是Spring @Configuration
类,它提供了一个工厂bean,它实现了一个工厂接口,该接口的方法接受来自应用程序的任意参数。 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);
}
};
}
}
答案 1 :(得分:0)
我不完全确定这个问题是一个骗局,(只有90%肯定),但这个回答:
https://stackoverflow.com/a/13243066/1768232
似乎拥有您需要的信息。具体来说,你应该这样做:
我通过从上下文中获取构造函数-arg中使用的bean实例,然后使用您在运行时使用的值填充它来实现它。当您获得工厂生成的bean时,此bean将用作参数。
public class X {
public void callFactoryAndGetNewInstance() {
User user = context.getBean("user");
user.setSomethingUsefull(...);
FileValidator validator = (FileValidator)context.getBean("fileValidator");
...
}
}
我建议阅读整个答案。