根据调用的资源方法注入不同的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
}
}
我们在我们的应用程序中使用 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
}
}