动态地从一个bean引用另一个bean

时间:2019-12-11 09:25:11

标签: cdi javabeans quarkus

是否可以通过动态方式(例如JNDI查找或@ApplicationScoped)从一个getBeanByName bean到另一个bean的引用?

例如:

@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 ....
  }
}

有人可以弄清楚如何通过名称或类或其他方式获取bean引用。

1 个答案:

答案 0 :(得分:0)

已解决。

这个想法是根据JSON请求中的服务名称或某些外部配置来选择Service 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;
  }
}