JSF2 ApplicationScope bean实例化时间?

alf*_*onx 6 java jsf jsf-2

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

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

ExternalContext ec = currentInstance.getExternalContext(); result =
    ec.getApplicationMap().get(beanName);
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 9

你可以eager=true@ManagedBean声明中使用.

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

    // ...

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

@ManagedBean
@RequestScoped
public class Register {

    @ManagedProperty("#{config}")
    private Config config;

    @PostConstruct
    public void init() {
        // ...
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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