在我看来,@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() {
// ...
}
// ...
}
JSF将在注入父bean之前自动创建它。它在@PostConstruct
之外的所有方法中都可用。