我似乎无法找到一种方法来强制在 Web 应用程序启动时实例化/初始化应用程序范围的托管 bean。似乎应用程序范围的 bean 在第一次访问 bean 时被延迟实例化,而不是在 web 应用程序启动时。对于我的网络应用程序,当第一个用户第一次在网络应用程序中打开一个页面时,就会发生这种情况。
我想避免这种情况的原因是因为在我的应用程序范围的 bean 的初始化过程中发生了许多耗时的数据库操作。它必须从持久存储中检索一堆数据,然后缓存其中的一些数据,这些数据将以 ListItem 元素等的形式经常显示给用户。我不希望所有这些在第一个用户连接时发生,因此造成长时间的延迟。
我的第一个想法是使用旧式 ServletContextListener contextInitialized() 方法,然后使用 ELResolver 手动请求托管 bean 的实例(从而强制进行初始化)。不幸的是,我不能在这个阶段使用 ELResolver 来触发初始化,因为 ELResolver 需要 FacesContext 并且 FacesContext 仅在请求的生命周期内存在。
有谁知道实现此目的的替代方法?
我使用 MyFaces 1.2 作为 JSF 实现,目前无法升级到 2.x。