选择在运行时弹出时要注入的实现

我有以下课程:

public interface MyInterface{} public class MyImpl1 implements MyInterface{} public class MyImpl2 implements MyInterface{} public class Runner { @Autowired private MyInterface myInterface; } 

我想做的是决定,虽然应用程序已经运行(即不在启动时),应该将实施注入Runner

所以理想情况是这样的:

 ApplicationContext appContext = ... Integer request = ... Runner runner = null; if (request == 1) { //here the property 'myInterface' of 'Runner' would be injected with MyImpl1 runner = appContext.getBean(Runner.class) } else if (request == 2) { //here the property 'myInterface' of 'Runner' would be injected with MyImpl2 runner = appContext.getBean(Runner.class) } runner.start(); 

完成此任务的最佳方法是什么?

使用@Component("implForRq1")@Component("implForRq2")声明实现

然后注入它们并使用:

 class Runner { @Autowired @Qualifier("implForRq1") private MyInterface runnerOfRq1; @Autowired @Qualifier("implForRq2") private MyInterface runnerOfRq2; void run(int rq) { switch (rq) { case 1: runnerOfRq1.run(); case 2: runnerOfRq2.run(); ... } } } ... @Autowired Runner runner; void run(int rq) { runner.run(rq); }