Как создать Bean, если у его класса конструктор с параметрами

Есть классы:

public class Car {
    private String name;
    private Engine engine;

    public Car(Engine engine) {
        this.engine = engine;
    }
}

public class Engine {
    private int volume;
}

Есть spring config:

@Configuration
public class Config {

    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car() {
        return new Car(engine());
    }
}

Есть приложение:

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Car lada = context.getBean("car", Car.class);
        System.out.println(lada);
    }
}

Это работает, но как задать параметр для инициализации? Если я хочу, чтобы при получении бина(car) из контекса, у класса Car указывалось имя(поле name). Есть ли возможность задать значения для полей вытягиваемого из контекста класса во время вызова getBean-метода?


Ответы (1 шт):

Автор решения: George_A

Добавьте в car

public Engine getEngine() {
   return engine;
}

Опубликуйте в registry некий CarProvider, который имеет метод getCar(Engine parameter)

@Component
public CardProvider {

   private final Map<Engine, Car> cars = Maps.newHashMap();
   
   @Autowired(required = false) 
   public void setCars(Collection<Car> cars) {
      cars.forEach(car -> this.cars.put(car.getEngine(), car));
   }

   @Nullable
   public Car getCar(Engine param) {
      return cars.get(param); 
   }
}
→ Ссылка