可以销毁CDI范围吗?

问题描述

| 我正在研究Java EE应用程序,主要是带有JSF管理控制台的JAX-RS,该应用程序使用CDI / Weld进行带有
javax.enterprise.context.ApplicationScoped
对象的依赖项注入。除了较小的调试问题,CDI在该项目中的表现非常出色。 现在,我需要对CDI注入的对象生命周期进行一些非常粗粒度的控制。我需要具备以下能力: 从应用程序上下文中删除注入的对象,或者 销毁/删除/清除/重置/删除整个应用程序上下文,或者 定义自己的ѭ1并实现
Context
,在其中我可以提供执行上述两个任务之一的方法。 我完全意识到,这通常跨越了CDI和依赖项注入的范围,如果不反对的话。我只是想知道 这可能吗? 如果是,完成工作的最简单/最简单/最快/最简单的方法是什么?     

解决方法

        焊接参考文档第2.1.2节   请记住,一旦绑定了一个bean   在上下文中,它仍然存在   直到上下文是上下文   毁了。没有办法手动   从上下文中删除bean。如果你   不想让豆子坐在   无限期会话,请考虑使用   另一个使用寿命短的示波器   例如要求或对话   范围。 自定义范围示例将veiwscoped jsf注释移植到cdi 如果您确实不想采用Custom作用域类型的路径,则可以使用非便携式方法,方法是使用BeanManager.getContext方法,并将此上下文转换为焊接AbstractSharedContext以访问beanstore或cleanUp ()方法的上下文。 检查此线程,了解如何为您的环境获取BeanManager实例     ,        您可以在https://github.com/openknowledge/openknowledge-cdi-extensions/tree/master/openknowledge-cdi-scope/src/main/java/de/openknowledge/cdi/scope中找到适合您需求的自定义范围也许您需要稍微调整一下实现。     ,        开箱即用的“对话”作用域可让您对其生命周期进行完全控制。但是,如果对话不符合您的需求,您可以创建自己的范围。 创建范围是一项艰巨的工作,但是您可以阅读焊接代码,并了解如何实现对话。     ,        在CDI 1.1中,有一个“ 3”接口,该接口可让您单独销毁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);
    }
}
这里的
beanManager
javax.enterprise.inject.spi.BeanManager
实例。您可以通过JNDI查找获得它:
InitialContext.doLookup(\"java:comp/BeanManager\");
或通过CDI静态方法:
CDI.current().getBeanManager();
,但请注意在某些Weld版本中static方法存在的问题: javax.enterprise.inject.spi.CDI实现不支持多个部署。 CDI.current()。getBeanManager()从其他部署返回一个beanmanager。