在我看来,@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。另请参阅 this answer 上的示例.
FacesContext context = FacesContext.getCurrentInstance();
Confic config = (Config) context.getApplication().evaluateExpressionGet(context, "#{config}", Config.class);
// ...
您也可以将其作为 @ManagedProperty
注入(inject)将 bean 放在您需要的地方。
@ManagedBean
@RequestScoped
public class Register {
@ManagedProperty("#{config}")
private Config config;
@PostConstruct
public void init() {
// ...
}
// ...
}
JSF 将在注入(inject)父 bean 之前自动创建它。它在 @PostConstruct
之外的所有方法中都可用。
关于java - JSF2 ApplicationScope bean实例化时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6967182/