我的.war部署在Payara后,我正在使用以下类进行一些初始化。我可以看到init()方法在应用程序启动过程中实际被调用了两次。为什么我的CDI启动类调用两次?
package mypackage;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Initialized;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import lombok.extern.log4j.Log4j2;
@Log4j2
@ApplicationScoped
public class StartupService {
@Inject LogConfig logConfig;
void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
log.debug("### STARTUP SERVICE CALLED ###");
logConfig.startup();
}
}
可为什么这个被称为两次我有人解释和我怎么能避免呢?
我的意思是,我当然可以实现静态布尔标志认识到,我已经过一次叫,但我宁愿解决的根本原因,只有得到所谓从一开始就一次。
为什么不使用'@ PostConstruct'? – juvenislux
这可能与不同的事件有效载荷(CDI规范,6.7.3应用程序上下文生命周期)有关 - 可以检查有效载荷是什么样的?它是'Object'还是'ServletContext'(你可以使用'instanceof')?我的赌注是每一次。如果是这样的话,我可以就我所知进一步制定:) – Siliarus
@juvenislux'@ ApplicationScoped'和'@ PostConstruct'不会导致启动过程中即时加载的类。你仍然需要“某人”来@ @注入@ @ PostConstruct这个类来执行 –