我们在我们的应用程序中使用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相关方法时创建冗余连接。
答案 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
}
}