java - 如何动态调用合格服务上的方法?

标签 java spring

我有一个界面如下:

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/

相关文章:

java - ArrayList.add() 不添加,不返回错误

java - @ConditionalOnExpression 如果属性存在

java - 如何在 Spring `@Value` 注释中插入类常量?

java - 该类没有定义 IdClass

java - Spring 注入(inject)类

java - Thymeleaf 3 和 Spring Boot 2.1 的模板解析错误

java - sun.net.www.protocol.https.HttpsURLConnectionImpl 无法转换为 sun.net.www.protocol.http.HttpURLConnection

Java如何有效地从列表中删除元素

java - 如何检查变量是否已初始化

java - 如何根据 Bean 定义是否存在注释来确定其优先级?