JSF2 ApplicationScope bean实例化时间?

在我看来,@ @ApplicationScoped bean只在第一次使用EL访问页面时启动。

当我查询ApplicationMap ,是否会创建@ApplicationScoped bean?

 ExternalContext ec = currentInstance.getExternalContext(); result = ec.getApplicationMap().get(beanName); 

如何在加载XHTML页面之前触发应用程序作用域bean的实例化?

您可以在@ManagedBean声明中使用eager=true

 @ManagedBean(eager=true) @ApplicationScoped public class Config { // ... } 

这样bean将在webapp的启动时自动处理。

除此之外,您还可以使用Application#evaluateExpressionGet()以编程方式评估EL,以便在必要时自动创建bean。 另请参阅此答案的示例。

 FacesContext context = FacesContext.getCurrentInstance(); Confic config = (Config) context.getApplication().evaluateExpressionGet(context, "#{config}", Config.class); // ... 

您也可以将它作为您需要它的bean的@ManagedProperty注入。

 @ManagedBean @RequestScoped public class Register { @ManagedProperty("#{config}") private Config config; @PostConstruct public void init() { // ... } // ... } 

在注入父bean之前,JSF将自动创建它。 它可以在@PostConstruct之外的所有方法中使用。