gpt4 book ai didi

无状态Bean的范围

转载 作者:行者123 更新时间:2023-12-04 01:24:03 25 4
gpt4 key购买 nike

我有一个像下面这样的无状态bean:

@Stateless
public class MyBean implements IMyBean {

@Inject
private SomeClass someClass;
@EJB
private MyRepository myRepository;
@Production
@Inject
private SomeFacade someWorker;

@PostConstruct
private void init() {
// some logic ...
}

// some more logic...
}

IMyBean 使用@Local 进行注释。
我正在运行 JBoss 服务器。我有一个使用 MyBean 的 .bat 文件。只有在这个 bat 文件的第一次执行中,@PostConstruct 才会被调用。这是为什么?哪个范围有 MyBean?看起来它至少是 ApplicationScoped。我以为是RequestScope ...

最佳答案

在成为 CDI bean 之前,您的 bean 是 EJB。因此它遵循无状态 EJB 的生命周期。第一次请求时,容器会创建它并调用 @PostConstruct打回来。当不再需要它时,它不会被销毁,而是返回到 EJB 无状态池中,以备重用。
从 CDI 的角度来看,它是 @Dependent bean:每次注入(inject)时都会重新创建它的 CDI 部分(代理),但 EJB 部分是由池中的 EJB 容器提供的。
查看 CDI 规范,与 Lifecycle of stateless and singleton session beans 相关的部分关于创作的陈述:

When the create() method of a Bean object that represents a stateless session or singleton session bean is called, the container creates and returns a container-specific internal local reference to the session bean. This reference is not directly exposed to the application.



关于破坏:

When the destroy() method is called, the container simply discards this internal reference.



内部引用被丢弃,但 EJB 容器保留 bean 以备将来重用。
如果多个用户同时请求此 bean,则可能会创建一个新的 EJB,并且 @PostConstruct将被调用。所以从用户的角度来看 postConstruct 调用可能看起来是随机的。

最好的解决方案是将无状态 bean 放入 @ApplicationScoped避免奇怪的行为。

关于无状态Bean的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com