Java 是否可以销毁CDI范围?
我正在开发一个JavaEE应用程序,主要是带有JSF管理控制台的JAX-RS,它使用CDI/Weld对对象进行依赖注入。撇开小的调试问题不谈,CDI在这个项目中工作得非常出色 现在,我需要对CDI注入的对象生命周期进行一些非常粗粒度的控制。我需要能够:Java 是否可以销毁CDI范围?,java,jakarta-ee,cdi,jboss-weld,Java,Jakarta Ee,Cdi,Jboss Weld,我正在开发一个JavaEE应用程序,主要是带有JSF管理控制台的JAX-RS,它使用CDI/Weld对对象进行依赖注入。撇开小的调试问题不谈,CDI在这个项目中工作得非常出色 现在,我需要对CDI注入的对象生命周期进行一些非常粗粒度的控制。我需要能够: 从应用程序上下文中删除注入的对象,或 销毁/删除/清除/重置/删除整个应用程序上下文,或 在其中,我可以提供执行上述两个任务之一的方法 我完全意识到,这与一般的CDI和依赖注入的粒度是一致的(如果不是相反的话)。我只是想知道 这有可能吗 如
- 从应用程序上下文中删除注入的对象,或
- 销毁/删除/清除/重置/删除整个应用程序上下文,或
- 在其中,我可以提供执行上述两个任务之一的方法
- 这有可能吗
- 如果是,完成工作的最简单/最简单/最快/最简单的方法是什么
创建范围是一项艰巨的工作,但您可以转到weld代码,看看对话是如何实现的。weld参考文档 记住,一旦一粒豆子被捆住了 从某种意义上说,它仍然是这样 上下文,直到上下文 摧毁。没有办法手动执行 从上下文中删除bean。如果你 我不想让豆子坐在椅子上 无限期会议,考虑使用 另一个使用寿命较短的范围, 例如请求或对话 范围 自定义范围示例 如果确实不希望采用自定义作用域类型的路径。。您可以通过使用方法使用不可移植的方法,并在焊接中强制转换此上下文,以访问beanstore或上下文的cleanUp()方法
检查此线程,了解如何为您的环境获取实例。一个可能适合您需要的自定义作用域可能在您需要稍微调整一下实现时可用。在CDI 1.1中,有一个
javax.enterprise.context.spi.AlterableContext
接口,允许您单独销毁一个bean实例。所有正常作用域(请求、会话、会话)都是可变的
AlterableContext ctxConversation = (AlterableContext) beanManager.getContext(ConversationScoped.class);
for (Bean<?> bean : beanManager.getBeans(Object.class)) {
Object instance = ctxConversation.get(bean);
if (instance != null) {
ctxConversation.destroy(instance);
}
}
或通过CDI静态方法:
CDI.current().getBeanManager();
,但要注意某些焊接版本中静态方法的问题:
- )李>
DestroyableContext
?是的。至少非常相似。您还可以查看MyFaces CODI的以JSF为中心的作用域,这些作用域也是细粒度的,但是如果您需要一些独立于JSF和/或易于用作自定义作用域模板的内容,那么这个可能适合。
CDI.current().getBeanManager();