我有一个界面如下:
public interface Solver {
void execute(final String definition);
}
我有几个求解器实现。例如:
@Qualifier("naive")
@Service
public class NaiveSolver implements Solver {
@Override
public void execute(final String definition) {
}
}
@Qualifier("optimal")
@Service
public class OptimalSolver implements Solver {
@Override
public void execute(final String definition) {
}
}
现在,在我的数据库中,我有这些求解器的数据如下:
type: textual - examples: simple, naive
definition: textual
在获取此数据时,我需要将type
列映射到实际的服务实例,以便它可以解决提供的定义
。
所以,我的问题归结为:给定一个 type
字符串,如何获取限定符相等的相应 Solver
服务实例的实例到那个类型
?我相信这里不能使用@Autowired,因为我需要在运行时动态查找bean。
最佳答案
从 Spring 4 开始,您可以将多个实现 Autowiring 到 Map 中,其中 bean 限定符是键,bean 本身是一个值
@Autowired
private Map<String, Solver> solvers;
void doStuff() {
String type = ... // obtain type
Solver solver = solvers.get(type);
solver.execute(...)
}
更新
命名 Bean 的正确方式不是
@Qualifier("naive")
@Service
但是
@Service("naive")
@Qualifier
与 @Autowired
一起使用,以确保注入(inject)正确的 Bean
@Autowired
@Qualifier("naive")
private Solver naiveSolver;
关于java - 如何动态调用合格服务上的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60989988/