动态地从一个 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;
  }
}