6

规范说,当作用域的上下文即将被销毁时,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 容器移除实例?谢谢。

4

3 回答 3

3

I think the CDI container needs a hook into the EJB container to ask it to "do what you'd do if an @Remove method had just completed". Looking at EJB spec, EJB 2.1 had a mechanism for this in the interfaces you had to extend.

For obvious reasons, the container calling an arbitrary @Remove annotated method for the side effect is pretty ill advised.

于 2012-05-03T23:13:08.263 回答
2

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

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

于 2012-10-01T19:32:15.410 回答
-1

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

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

于 2012-05-02T19:57:30.357 回答