根据所谓的资源方法注入不同的bean

时间:2016-01-11 12:06:00

标签: java dependency-injection cdi

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

1 个答案:

答案 0 :(得分:0)

根据所谓的方法似乎没有办法注入不同的bean。由于在bean创建期间进行了注射,因此容器无法知道将要调用哪个函数,并且在我们决定之前无法保持注入。要解决这个问题,我们要么使用Programmatic Bean Lookup(使用BeanManager类)来访问上下文bean,要么我们可以通过Instance<T>接口访问它们。如果我们使用Instance接口,我们必须小心不要有内存泄漏。这是为什么?因为以这种方式注入的每个bean都获得了范围@Dependent,这意味着当注入类本身被销毁时它将被释放。如果注入器类的范围是例如@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
  }
}