Java Spring与FactoryModuleBuilder、@AssistedInject和@Assisted in Guice的等价物是什么?
中的、、和的等价物是什么?换句话说,推荐使用Spring创建工厂对象的方法是什么,这些工厂对象的方法接受应用程序(而不是容器)必须提供的参数Java Spring与FactoryModuleBuilder、@AssistedInject和@Assisted in Guice的等价物是什么?,java,spring,guice,Java,Spring,Guice,中的、、和的等价物是什么?换句话说,推荐使用Spring创建工厂对象的方法是什么,这些工厂对象的方法接受应用程序(而不是容器)必须提供的参数 Spring静态工厂方法与FactoryModuleBuilder不同FactoryModuleBuilder构建一个Guice模块,该模块生成实现的“工厂”。与Spring静态工厂方法不同,这些工厂对象的方法是实例方法,而不是静态方法。静态工厂方法的问题是,它是静态的,并且没有实现接口,因此不能用替代工厂实现替换它。但是,不同的FactoryModule
Spring静态工厂方法与FactoryModuleBuilder不同
FactoryModuleBuilder
构建一个Guice模块,该模块生成实现的“工厂”。与Spring静态工厂方法不同,这些工厂对象的方法是实例方法,而不是静态方法。静态工厂方法的问题是,它是静态的,并且没有实现接口,因此不能用替代工厂实现替换它。但是,不同的FactoryModuleBuilder
实例可以构建实现相同接口的不同工厂。我不完全确定这个问题是否重复(只有90%确定),但这个答案是:
似乎有你需要的信息。具体来说,您应该这样做:
我通过从上下文中提取构造函数arg中使用的bean实例,然后用运行时使用的值填充它,从而使它工作起来。当您获得工厂生成的bean时,这个bean将被用作参数
我建议阅读完整的答案。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);
}
};
}
}
此答案的可能重复引用了一个静态工厂方法,该方法与FactoryModuleBuilder
生成的工厂不同。非常有用!只有一个问题,在Guice中,我们可以将一个值传递给工厂,@Assisted
one和所有其他依赖项都得到解决。例如,除了NumberOfPassenger之外,lets supose outrCar类取决于另一个服务类,该服务类被注入到构造函数中。使用Guice,VehicleFactory的参数numberOfPassagens用@Assisted
注释,因为Car类用@AssistedInject
注释,所有其他依赖项都已解决。Spring如何在不手动调用@Bean
getter方法的情况下解决其他依赖项?
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);
}
};
}
}