Quarkus/CDI ApplicationScoped bean 是否可以出于任何原因从运行时的上下文或垃圾收集中删除?
Can Quarkus/CDI ApplicationScoped beans be removed from context or garbage collected at runtime for any reason?
我的理解是这些 bean 是简单的 java 对象,但是一旦它们在构建时被删除并被(懒惰地)初始化,它们就会无限期地保留在上下文中,不应该GC-able 即使他们长时间闲置。
但是在 运行 之后我无法通过 2.0 CDI specs 和 bean lifecycle/CDI 相关的 Quarkus 文档来确认它。
有没有可能发生这种情况的具体情况?
所以理论上,您可以执行 AlterableContext#destroy(Contextual<?>)
- 这将从上下文中删除上下文实例(即您的 @ApplicationScoped
bean 的实例),然后如果没有其他参考资料。
例如,在 quarkus 中你可以做到 Arc.container().instance(MyApplicationScopedFoo.class).destroy()
。如果存在,这将调用 @PreDestroy
回调,如果绑定,将调用 @PreDestroy
拦截器,并从应用程序上下文中删除 MyApplicationScopedFoo
实例。
我的理解是这些 bean 是简单的 java 对象,但是一旦它们在构建时被删除并被(懒惰地)初始化,它们就会无限期地保留在上下文中,不应该GC-able 即使他们长时间闲置。
但是在 运行 之后我无法通过 2.0 CDI specs 和 bean lifecycle/CDI 相关的 Quarkus 文档来确认它。
有没有可能发生这种情况的具体情况?
所以理论上,您可以执行 AlterableContext#destroy(Contextual<?>)
- 这将从上下文中删除上下文实例(即您的 @ApplicationScoped
bean 的实例),然后如果没有其他参考资料。
例如,在 quarkus 中你可以做到 Arc.container().instance(MyApplicationScopedFoo.class).destroy()
。如果存在,这将调用 @PreDestroy
回调,如果绑定,将调用 @PreDestroy
拦截器,并从应用程序上下文中删除 MyApplicationScopedFoo
实例。