2017-01-06 8 views
0

Я работаю над проектом, который был реализован с использованием Guice, но нам нужно перенести его на Spring 3.x, и у нас есть этот прецедент, где beans нуждаются в дополнительных параметрах для создания. Как это реализовано весной? можно ли реализовать только аннотации (и без xml)?Как перенести bean-компонент с дополнительными параметрами, используя @Assisted от Guice to Spring?

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(); 
    } 
} 

ответ

2

Похоже, вам нужен фасоль завода, который возвращает CarImpl.

public interface CarFactory { 
    Car create (String brand, String model); 
} 


@Bean 
public CarFactory carFactory() { 
    return CarImpl::new; 
} 
+0

Thanks! Смешивается ли это с фасолью, например, если у создателя есть компонент, например. 'create (String brand, String model, @Bean InsuranceContract insurance)'? –

+0

Измените подпись метода создания CarFactory и конструктора CarImpl, чтобы принять InsuranceContract. Я не думаю, что вы хотели бы создать компонент CarFactory для каждого компонента InsuranceContract Bean. –

+0

Просто сделал это, но у нас тоже есть такой вариант использования. –