动态地从一个 bean 获取对另一个 bean 的引用
Getting reference from one bean to another dynamically
是否可以通过动态方式从一个 @ApplicationScoped
bean 获取对另一个 bean 的引用,例如 JNDI 查找或 getBeanByName
?
例如:
@ApplicationScoped
public class MaltiService {
@Inject
BeanManager mgr;
public JsonObject execute(JsonObject request, String taskClassName) {
// for eaxample taskClassName="com.mybean.MyTask"
// Does not work ...
Set<Bean<?> beans = mgr.getBeans(taskClassName);
.....
myTasksInterface.performTask();
}
}
@ApplicationScoped
public class MyTask implements MyTasksInterface {
public performTask() {
// Do something ....
}
}
有人可以澄清一下,如何通过名称或 class 或其他方式获取 bean 引用。
已解决。
思路是select根据JSON请求中的服务名或者根据一些外部配置来selectService Bean。
@Unremovable 注释防止 Quarkus 删除 bean,以防它没有被直接注入。
@ApplicationScoped
public class MaltiService {
@Inject
BeanManager mgr;
public JsonObject execute(JsonObject request, String taskClassName) {
MyTasksInterface myTasksInterface = getServiceBean(request.get("taskClassName"));
// do somthing
return myTasksInterface.performTask(JsonObject request);
}
//Method example to get a bean reference
private MyTasksInterface getServiceBean(String beanClassName) throws Exception {
ServiceJsonTask ret = null;
Class<?> clazz = Class.forName(beanClassName);
Set<Bean<?>> beans = mgr.getBeans(clazz);
if (beans != null && beans.iterator().hasNext()) {
Bean<?> bean = beans.iterator().next();
CreationalContext<?> ctx = mgr.createCreationalContext(bean);
ret = (ServiceJsonTask) mgr.getReference(bean, clazz, ctx);
}
return ret;
}
}
// Annotate bean as @Unremovable
@ApplicationScoped
@Unremovable
public class MyTask implements MyTasksInterface {
public JsonObject performTask(JsonObject request) {
JsonObject ret = new JsonObject();
// Do something ....
return ret;
}
}
是否可以通过动态方式从一个 @ApplicationScoped
bean 获取对另一个 bean 的引用,例如 JNDI 查找或 getBeanByName
?
例如:
@ApplicationScoped
public class MaltiService {
@Inject
BeanManager mgr;
public JsonObject execute(JsonObject request, String taskClassName) {
// for eaxample taskClassName="com.mybean.MyTask"
// Does not work ...
Set<Bean<?> beans = mgr.getBeans(taskClassName);
.....
myTasksInterface.performTask();
}
}
@ApplicationScoped
public class MyTask implements MyTasksInterface {
public performTask() {
// Do something ....
}
}
有人可以澄清一下,如何通过名称或 class 或其他方式获取 bean 引用。
已解决。
思路是select根据JSON请求中的服务名或者根据一些外部配置来selectService Bean。 @Unremovable 注释防止 Quarkus 删除 bean,以防它没有被直接注入。
@ApplicationScoped
public class MaltiService {
@Inject
BeanManager mgr;
public JsonObject execute(JsonObject request, String taskClassName) {
MyTasksInterface myTasksInterface = getServiceBean(request.get("taskClassName"));
// do somthing
return myTasksInterface.performTask(JsonObject request);
}
//Method example to get a bean reference
private MyTasksInterface getServiceBean(String beanClassName) throws Exception {
ServiceJsonTask ret = null;
Class<?> clazz = Class.forName(beanClassName);
Set<Bean<?>> beans = mgr.getBeans(clazz);
if (beans != null && beans.iterator().hasNext()) {
Bean<?> bean = beans.iterator().next();
CreationalContext<?> ctx = mgr.createCreationalContext(bean);
ret = (ServiceJsonTask) mgr.getReference(bean, clazz, ctx);
}
return ret;
}
}
// Annotate bean as @Unremovable
@ApplicationScoped
@Unremovable
public class MyTask implements MyTasksInterface {
public JsonObject performTask(JsonObject request) {
JsonObject ret = new JsonObject();
// Do something ....
return ret;
}
}