注入实现相同接口的 bean 列表
Inject list of beans implementing same interface
假设我有以下界面
public interface Handler {
void handle(Object o);
}
和实施
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
}
}
我想将所有 Handler
subclass 注入一些 class
public class Foo {
private List<Handler> handlers;
}
如何使用 Quarkus 实现此目的?
所有实现都需要标记为@ApplicationScoped,如:
@ApplicationScoped
public class PrintHandler implements Handler {
public String handle() {
return "PrintHandler";
}
}
在要注入所有实现的class中,使用
@Inject
Instance<Handler> handlers;
此 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;
}
假设我有以下界面
public interface Handler {
void handle(Object o);
}
和实施
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
}
}
我想将所有 Handler
subclass 注入一些 class
public class Foo {
private List<Handler> handlers;
}
如何使用 Quarkus 实现此目的?
所有实现都需要标记为@ApplicationScoped,如:
@ApplicationScoped
public class PrintHandler implements Handler {
public String handle() {
return "PrintHandler";
}
}
在要注入所有实现的class中,使用
@Inject
Instance<Handler> handlers;
此 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;
}