0

我正在开发一个具有多个 SFSB 的应用程序,它们都实现了相同的接口。

为了在运行时决定使用哪个具体实现,我有以下工厂方法:

@SuppressWarnings("rawtypes")
@Inject @Any Instance<SFSBInterface> sfsbSource;

public <T> SFSBInterface<T> initBeanForm(Class<T> clazz, Class<? extends SFSBInterface<T>> sfsbClass, Annotation... qualifiers) {
    SFSBInterface<T> sfsb = sfsbSource.select(sfsbClass, qualifiers).get();
    return sfsb;
}

每个具体的实现都实现了一个@Remove 注释方法。现在我有一个案例,我想删除这个 sfsb 并在调用这个方法时获得一个新的实例。

我正在调用 remove 方法并删除对该对象的所有引用,但该实例一直在内存中。当我现在请求这个类的一个实例时,我得到了相同的实例,我之前为此调用了 remove。

我的问题是:

  1. 如果我使用我调用 remove 方法的这个实例,我会遇到问题吗?
  2. 删除的实例保留在内存中是否正常?
  3. 我怎样才能有效地删除这个实例?
  4. 我怎样才能获得我的班级的一个真正的新实例?

亲切的问候克里斯蒂安

顺便说一句:我正在使用 JBoss 7.1.1 和 Weld

4

1 回答 1

0

当我现在请求这个类的一个实例时,我得到了相同的实例,我之前为此调用了 remove。

我会说这种行为超出了规范,因此高度依赖于供应商。新 bean 可以从旧实例池中获取(这似乎是这里的情况)或新创建的。这个策略可以(理论上)随着你的应用服务器的新版本而改变,甚至更糟:从一个环境到另一个环境。

一个核心问题是您如何确定它是“新实例”?

我认为,如果你能忍受它,这并不容易回答。

下一步应该做的是检查新 bean 的生命周期钩子。如果一切都被调用并且所有依赖项都被正确注入,那么恕我直言,它看起来相当不错。

否则请随时更新问题:)

于 2012-06-13T07:17:11.480 回答