【问题标题】:JSF2 ApplicationScope bean instantiation time?JSF2 ApplicationScope bean实例化时间?
【发布时间】:2011-10-21 11:37:16
【问题描述】:

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

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

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

在加载 XHTML 页面之前,我还能如何触发应用程序范围 bean 的实例化?

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    您可以在@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);
    // ...
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 2013-03-20
      • 2011-12-05
      • 2013-11-20
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多