Chr*_*311 2 scope postconstruct cdi
我得到了一个如下所示的无状态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...
}
Run Code Online (Sandbox Code Playgroud)
IMyBean带有@Local注释。我正在运行JBoss服务器。我得到了一个使用MyBean的.bat文件。仅在第一次执行此bat文件时,才调用@PostConstruct。这是为什么?MyBean属于哪个范围?似乎至少是ApplicationScoped。我以为那是RequestScope ...
在成为CDI bean之前,您的bean是EJB。因此,它遵循无状态EJB的生命周期。首次请求时,容器会创建它并调用@PostConstruct回调。当不再需要它时,它不会被返回EJB无状态池破坏,可以重用。从CDI角度看,它是一个@Dependentbean:每次注入时都会重新创建它的CDI部分(代理),但是EJB部分由池中的EJB容器提供。查看CDI规范,与无状态会话和单例会话bean的生命周期有关的部分说明了有关创建的信息:
调用表示无状态会话或单例会话Bean的Bean对象的create()方法时,容器将创建该容器并向该会话bean返回特定于容器的内部本地引用。此参考没有直接向应用程序公开。
关于破坏:
调用destroy()方法时,容器会简单地丢弃此内部引用。
内部引用被丢弃,但是EJB容器保留Bean供将来重复使用。如果有多个用户同时请求该bean,则可能会创建一个新的EJB @PostConstruct并将调用。因此,从用户的角度来看,postConstruct调用似乎是随机的。
最好的解决方案是将无状态bean放入@ApplicationScoped以避免奇怪的行为。