我在应用程序中使用SpringBoot,当前正在使用applicationContext.getBean(beanName,beanClass)
在对它执行操作之前获取我的bean。我在几个问题中看到不鼓励使用getBean()
。由于我是Spring的新手,所以我不了解所有最佳实践,并且相互矛盾。上述链接问题中提出的解决方案可能不适用于我的用例。我应该如何处理?
@RestController
@RequestMapping("/api")
public class APIHandler {
@Value("${fromConfig}")
String fromConfig;
private ApplicationContext applicationContext;
public Bot(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@PostMapping(value = "")
public ResponseEntity post(@RequestBody HandlingClass requestBody) {
SomeInterface someInterface = applicationContext.getBean(fromConfig, SomeInterface.class);
someInterface.doSomething();
}
}
我有一个称为
SomeInterface
的接口,定义如下:public interface SomeInterface {
void doSomething();
}
我有2个实现此接口的类
UseClass1
和UseClass2
。我的配置文件存储了一个字符串,该字符串具有我需要在运行时知道的类的Bean名称,并调用该方法的适当实现。任何方向将不胜感激。
最佳答案
从Spring 4.3开始,您可以将所有实现自动连接到由对beanName beanInstance对组成的Map中:
public class APIHandler {
@Autowired
private Map<String, SomeInterface> impls;
public ResponseEntity post(@RequestBody HandlingClass requestBody) {
String beanName = "..."; // resolve from your requestBody
SomeInterface someInterface = impls.get(beanName);
someInterface.doSomething();
}
}
假设您有以下两种实现
// qualifier can be omitted, then it will be "UseClass1" by default
@Service("beanName1")
public class UseClass1 implements SomeInterface { }
// qualifier can be omitted, then it will be "UseClass2" by default
@Service("beanName2")
public class UseClass2 implements SomeInterface { }