10

我正在开发一个 Java EE 应用程序,主要是带有 JSF 管理控制台的 JAX-RS,它使用 CDI/Weld 对javax.enterprise.context.ApplicationScoped对象进行依赖注入。除了一些小的调试问题,CDI 为这个项目工作得很好。

现在我需要对注入 CDI 的对象生命周期进行一些非常粗粒度的控制。我需要具备以下能力:

  • 从应用程序上下文中删除注入的对象,或
  • 销毁/删除/清除/重置/删除整个应用程序上下文,或
  • 定义我自己的@ScopeType和实现Context,我可以在其中提供执行上述两个任务之一的方法。

我完全意识到,这与 CDI 和依赖注入的本质是相通的,如果不是反对的话。我只是想知道

  • 这远程可能吗?
  • 如果是,完成工作的最简单/最简单/最快/最万无一失的方法是什么?
4

4 回答 4

5

焊接参考文档第 2.1.2 节

请记住,一旦 bean 绑定到上下文,它就会一直保留在该上下文中,直到上下文被销毁。无法从上下文中手动删除 bean。如果您不希望 bean 无限期地坐在会话中,请考虑使用另一个生命周期较短的范围,例如请求或会话范围。

自定义范围示例将 veiwscoped jsf annonation 移植到 cdi

如果您真的不想采用自定义范围类型的路径。您可以通过使用BeanManager.getContext方法来使用不可移植的方法,并将此上下文强制转换为焊接AbstractSharedContext以访问 beanstore 或 cleanUp( ) 上下文的方法。

检查此线程以了解如何为您的环境获取BeanManager实例

于 2011-07-03T22:48:47.147 回答
4

可以在https://github.com/openknowledge/openknowledge-cdi-extensions/tree/master/openknowledge-cdi-scope/src/main/java/de/openknowledge/cdi/scope获得一个可能适合您需求的自定义范围也许你必须稍微调整一下实现。

于 2011-08-30T02:17:04.717 回答
1

开箱即用的只有 Conversation 范围可以让您完全控制其生命周期。但是,如果对话不适合您的需要,您可以创建自己的范围。创建范围是一项艰巨的工作,但您可以去焊接代码并查看对话是如何实现的。

于 2011-06-30T20:35:44.460 回答
1

在 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);
    }
}

beanManager是一个javax.enterprise.inject.spi.BeanManager例子。您可以通过 JNDI 查找获得它:

InitialContext.doLookup("java:comp/BeanManager");

或通过 CDI 静态方法:

CDI.current().getBeanManager();

,但请注意某些 Weld 版本中静态方法的问题:

于 2014-06-16T11:45:26.040 回答