根据调用的资源方法注入不同的bean

Injecting different bean according to resource method called

我们在我们的应用程序中使用 CDI(不是 EJB)。我们有一个资源层、一个业务 bean 层和一个数据库处理程序 bean 层。所有这些豆子都是 @RequestScoped。现在资源注入了一个业务 bean,它又注入了它需要的所有 dbhandler bean。由于这是 CDI 并且没有对象池(至少据我所知)是否有一种方法可以根据调用的方法来决定注入(并因此创建)哪些 bean?例如,我有 2 个业务 bean 方法。方法 1 使用 DAOBean1,方法 2 使用 DAOBean1 AND DAOBean2。现在,即使我只想使用 Method1,业务 bean 也会注入两个 DAO bean。有没有办法根据方法调用过滤注入的bean?这很重要,因为我们有一个在其 @PostConstruct 上创建数据源连接的 bean,但并非所有 bean 方法都查询数据库,这意味着我们在将 bean 用于非数据库相关方法时创建冗余连接。

好像没有办法根据调用的方法注入不同的bean。由于注入是在创建 bean 期间解决的,因此容器无法知道将调用哪个函数,并且在我们决定之前无法保留注入。为了解决这个问题,我们要么使用 Programmatic Bean Lookup(使用 BeanManager class)来访问 in-context beans,要么我们可以通过 Instance<T> 接口访问它们。如果我们使用Instance接口,一定要注意不要有内存泄漏。这是为什么?因为以这种方式注入的每个 bean 都会获得范围 @Dependent,这意味着当注入器 class 本身被销毁时它将被释放。例如,如果注入器 class 的范围是 @ApplicationScoped,则 bean 本身将永远不会被释放,从而造成内存泄漏。在这种情况下,我们使用 Instance 接口的方法 `destroy(myBean).

示例:

@ApplicationScoped
public class MyClass {

  @Inject
  Instance<MyBean> myBeanInstance;

  public void myMethod() {
    //...
    MyBean bean = myBeanInstance.get();
    // Do stuff with bean
    myBeanInstance.destroy(bean); //Release the bean otherwise it will hold memory
  }
}