CDI如何删除有状态会话bean?

时间:2012-05-01 20:00:48

标签: cdi ejb-3.1

规范说CDI容器在范围的上下文即将被销毁时删除了SFSB。它是如何完全删除EJB的?它似乎没有调用@Remove注释的方法。

@Stateful
public class CustomerDAOImpl implements CustomerDAO {
    @PreDestroy
    public void onDestroy() {
        //This is getting called as expected
    }
    @Remove
    public void deleteMyBean() {
        //This is not getting called!
    }
}

因此,CDI在技术上正在做规范所说的。问题是它如何设法要求EJB容器删除实例?感谢。

3 个答案:

答案 0 :(得分:3)

我认为CDI容器需要一个钩子进入EJB容器,要求它“执行@Remove方法刚刚完成后你要做的事情”。看看EJB规范,EJB 2.1在你必须扩展的接口中有一个机制。

由于显而易见的原因,容器调用任意@Remove注释方法的副作用是非常不明智的。

答案 1 :(得分:2)

正如Covener所说,这是使用特定于实现的EJB API完成的,而不是EJB标准API的一部分。

正如Covener所说,调用@Remove是 NOT 正确的继续进行方式。 @Remove方法由用户代码调用,告诉 EJB容器以删除EJB。如果要在删除EJB时进行回调,请使用@PreDestroy。

答案 2 :(得分:-1)

具有@Remove注释的方法必须由客户端显式调用,然后容器将隐式调用带有@PreDestroy注释的方法(如果存在)。之后,bean实例将准备好进行垃圾回收。

这是客户端可以控制的唯一生命周期方法,所有其他方法都由容器控制。