为什么@ApplicationScoped bean在我的CDI扩展的BeforeShutdown阶段有一个新实例?

时间:2014-10-26 19:22:11

标签: java cdi weld

我想在关闭CDI应用程序时对bean进行一些清理。例如,我想关闭IO连接。当然,在这里,bean被标记为@ApplicationScoped。

为了管理这个,我写了一个扩展并观察BeforeShutdown事件,然后我选择我的bean来调用一个清理方法:

public void beforeShutdown(@Observes BeforeShutdown beforeShutdown) {
    SomeBean obj = CDI.current().select(SomeBean.class).get();
    obj.cleanup();
}

我的问题是我可以访问此方法中的新实例。不是我在整个应用程序中得到的实例。

如果你想看到这个实例问题,我已经在github上创建了一个repo来显示它:https://github.com/hasalex/cdi-extension-demo

所以我有两个问题:

  • 为什么我会得到一个新实例?
  • 在应用程序结束时还有其他方法可以清理我的bean吗? (在SE和WildFly环境中)

1 个答案:

答案 0 :(得分:4)

看这里:http://docs.jboss.org/cdi/spec/1.1.EDR1/html/spi.html#provider

  

11.5.4。 BeforeShutdown事件

     

容器必须在完成处理请求并销毁所有上下文后触发最终事件。

也许你想使用@PreDestroy:http://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html

  

使用javax.annotation.PreDestroy批注注释方法的声明。

     

CDI在开始销毁bean之前调用此方法。