【问题标题】:When unreferenced @Singleton beans are destroyed?当未引用的@Singleton bean 被销毁时?
【发布时间】:2014-03-18 11:35:03
【问题描述】:

我有一个带有 CDI/Weld 的 Java SE 应用程序(以 org.jboss.weld.environment.se.StartMain 开头)。

我正在将@Singleton bean 注入另一个 bean:

public class CdiMain {

    @Inject
    private MySingleton mySingleton;

    public void onStart(@Observes ContainerInitialized event) {
        mySingleton.printHello();
        mySingleton = null;

        // other long running stuff
    }
}

printHello 方法之后我不需要单例 bean。什么时候销毁?

【问题讨论】:

  • 我相信是你关闭容器的时候。
  • 如果您的CdiMain bean 对象引用未被以任何方式引用,CdiMainMySingleton 都将有资格被 GC 释放。
  • @LuiggiMendoza:您确定 CDI 不会为其 bean 提供引用,从而阻止 GC 释放 mySingleton 实例吗?
  • @jt8 因为它是@Singleton,所以 CDI 将保持引用直到应用程序被取消部署。但这并不意味着CdiMain 的引用将保持活动状态。
  • 它们就像转基因生物——弗兰肯豆。

标签: java scope cdi


【解决方案1】:

From the docs 尚不清楚@Singleton bean 是否会在某个特定点被销毁。
我不会依赖那个。例如,在 Weld.shutdown() 期间,@PreDestroy 方法不会在 @Singleton 上调用。

改用@ApplicationScoped bean,它在功能上是相同的(除了它是代理的),在 Java SE 中也可用,并且在应用程序上下文结束时将被“销毁”。

【讨论】:

  • 感谢您的回答!仅作记录:在 Java SE 中使用 Weld 在 @Signletons 上调用 @PreDestory 方法。
  • full doc 更完整:它在其生命周期结束时被销毁(这又是容器生命周期的结束)。
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多