是否有可能破坏CDI范围?

时间:2011-06-23 19:16:21

标签: java java-ee cdi jboss-weld

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

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

我完全清楚,如果不是反对CDI和依赖注入的一般情况,这是相互影响的。我只是想知道

  • 这是远程可能吗?
  • 如果是,那么完成工作的最简单/最简单/最快/最愚蠢的方法是什么?

4 个答案:

答案 0 :(得分:4)

焊接参考文档Section 2.1.2

  

请记住,一旦绑定了bean   在某种情况下,它仍然存在   上下文直到上下文   销毁。没有办法手动   从上下文中删除bean。如果你   不要让豆子坐在里面   会话无限期,考虑使用   另一个寿命缩短的范围,   例如请求或对话   范围。

自定义范围示例Porting the veiwscoped jsf annonation to cdi

如果您确实不想采用自定义范围类型的路径..您可以使用{strong>非便携式方法,使用BeanManager.getContext方法并将此上下文转换为焊接AbstractSharedContext以访问beanstore或上下文的cleanUp()方法。

检查此主题如何为您的环境获取BeanManager实例

答案 1 :(得分:4)

可以在https://github.com/openknowledge/openknowledge-cdi-extensions/tree/master/openknowledge-cdi-scope/src/main/java/de/openknowledge/cdi/scope处找到可能符合您需求的自定义范围。也许您必须稍微调整一下实施。

答案 2 :(得分:1)

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

答案 3 :(得分: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版本中静态方法的问题: