我有以下课程:
public interface MyInterface{} public class MyImpl1 implements MyInterface{} public class MyImpl2 implements MyInterface{} public class Runner { @Autowired private MyInterface myInterface; }
我要确定的是,在应用已运行(即未启动时)的情况下,应将哪种实施注入Runner。
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")
@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); }