注入实现相同接口的 bean 列表

Nik*_*dev 2 java cdi quarkus

假设我有以下界面

public interface Handler {
    void handle(Object o);
}
Run Code Online (Sandbox Code Playgroud)

和实现

public class PrintHandler implements Handler {
    void handle(Object o) {
        System.out.println(o);
    }
}
public class YetAnotherHandler implements Handler {
    void handle(Object o) {
        // do some stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将所有Handler子类注入某个类

public class Foo {
    private List<Handler> handlers;
}
Run Code Online (Sandbox Code Playgroud)

如何使用 Quarkus 实现这一目标?

Ash*_*shu 7

所有实现都需要标记为@ApplicationScoped,例如:

@ApplicationScoped
public class PrintHandler implements Handler {
    public String handle() {
        return "PrintHandler";
    }
}
Run Code Online (Sandbox Code Playgroud)

在要注入所有实现的类中,使用

@Inject
Instance<Handler> handlers;
Run Code Online (Sandbox Code Playgroud)

Instance是进口的javax.enterprise.inject.Instance;

handlers变量将具有Handler接口的所有实现。

javax.enterprise.inject.Instance还实现了 ,Iterable因此您可以对其进行迭代并调用所需的方法。

@Inject
Instance<Handler> handlers;

@GET
@Produces(MediaType.TEXT_PLAIN)
public List<String> handle() {
    List<String> list = new ArrayList<>();
    handlers.forEach(handler -> list.add(handler.handle()));
    return list;
}
Run Code Online (Sandbox Code Playgroud)