问题描述
|
我正在研究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。