如何使用 @Assisted 将 bean "with additional parameters" 从 Guice 迁移到 Spring?
How to migrate bean "with additional parameters" using @Assisted from Guice to Spring?
我在一个使用 Guice 实现的项目中工作,但我们需要将它迁移到 Spring 3.x 并且我们在下面有这个用例,其中 bean 需要额外的参数来创建。这在 Spring 中是如何实现的?是否可以仅使用注释(而不是 xml)来实现?
import com.google.inject.AbstractModule;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.google.inject.assistedinject.Assisted;
import javax.inject.Inject;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
super.binder().install(new FactoryModuleBuilder().
implement(Car.class, CarImpl.class).
build(CarFactory.class));
}
}
public interface Car {
String getBrand();
String getModel();
}
public class CarImpl implements Car {
public CarImpl(@Assisted("brand") String brand, @Assisted("model") String model) {
this.brand = brand;
this.model = model;
}
@Override
String getBrand() { return brand; }
@Override
String getModel() { return model; }
private final String brand;
private final String model;
}
public interface CarFactory {
Car create(@Assisted("brand") String brand, @Assisted("model") String model);
}
public class Client {
@Inject CarFactory carFactory;
final Car myCar;
public Client() {
myCar = carFactory.create("BMW", "530d xDrive");
}
void driveIt() { /* don't crash it */ }
public static void main(String[] args) {
new Client().driveIt();
}
}
看起来您只需要一个 returns CarImpl 的工厂 bean。
public interface CarFactory {
Car create (String brand, String model);
}
@Bean
public CarFactory carFactory () {
return CarImpl::new;
}
我在一个使用 Guice 实现的项目中工作,但我们需要将它迁移到 Spring 3.x 并且我们在下面有这个用例,其中 bean 需要额外的参数来创建。这在 Spring 中是如何实现的?是否可以仅使用注释(而不是 xml)来实现?
import com.google.inject.AbstractModule;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.google.inject.assistedinject.Assisted;
import javax.inject.Inject;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
super.binder().install(new FactoryModuleBuilder().
implement(Car.class, CarImpl.class).
build(CarFactory.class));
}
}
public interface Car {
String getBrand();
String getModel();
}
public class CarImpl implements Car {
public CarImpl(@Assisted("brand") String brand, @Assisted("model") String model) {
this.brand = brand;
this.model = model;
}
@Override
String getBrand() { return brand; }
@Override
String getModel() { return model; }
private final String brand;
private final String model;
}
public interface CarFactory {
Car create(@Assisted("brand") String brand, @Assisted("model") String model);
}
public class Client {
@Inject CarFactory carFactory;
final Car myCar;
public Client() {
myCar = carFactory.create("BMW", "530d xDrive");
}
void driveIt() { /* don't crash it */ }
public static void main(String[] args) {
new Client().driveIt();
}
}
看起来您只需要一个 returns CarImpl 的工厂 bean。
public interface CarFactory {
Car create (String brand, String model);
}
@Bean
public CarFactory carFactory () {
return CarImpl::new;
}