每个人都知道JSF 2中热切的托管bean。@ ManagedBean具有eager属性。 如果eager ='true'并且范围是application,那么必须在应用程序启动时而不是在第一次引用该bean时创建此bean。 当您要在应用程序启动期间加载应用程序范围的数据(例如,菜单的某些选择项)以提高运行时的性能时,这是一个很好的功能。
@ManagedBean(eager=true)
@ApplicationScoped
public class GlobalBean {...
}
@ManagedBean批注将在JSF 2.2中弃用。 强烈建议在JEE环境中使用CDI(上下文依赖注入)bean。 但是,与CDI中急切管理的bean等效呢? 好吧,CDI非常灵活,您可以编写可移植的CDI扩展 。 我问托马斯·安德拉奇科(Thomas Andraschko)该怎么做。 Thomas是一位CDI专家,是PrimeFaces Extensions的共同所有者,也是OpenWebBeans(OWB)项目的提交者。 他的提示是实施如下扩展:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE})
public @interface Eager
{
}
package mydomain.mypackage;import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterDeploymentValidation;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessBean;public class EagerExtension implements Extension {private List<Bean<?>> eagerBeansList = new ArrayList<Bean<?>>();public <T> void collect(@Observes ProcessBean<T> event) {if (event.getAnnotated().isAnnotationPresent(Eager.class)&& event.getAnnotated().isAnnotationPresent(ApplicationScoped.class)) {eagerBeansList.add(event.getBean());}}public void load(@Observes AfterDeploymentValidation event, BeanManager beanManager) {for (Bean<?> bean : eagerBeansList) {// note: toString() is important to instantiate the beanbeanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean)).toString();}}
}
扩展应该在文件META-INF / services / javax.enterprise.inject.spi.Extension中注册。 该文件只有一行带有EagerExtension类的完全限定路径,例如mydomain.mypackage.EagerExtension。 使用很简单。 假设,我们有一个应用程序范围的LayoutController CDI bean,它负责整个布局配置。 我们可以使用@Eager对其进行注释,并加快布局的创建。
@ApplicationScoped
@Eager
@Named
public class LayoutController implements Serializable {private LayoutOptions layoutOptions;@PostConstructprotected void initialize() {layoutOptions = new LayoutOptions();LayoutOptions panes = new LayoutOptions();panes.addOption('slidable', false);panes.addOption('spacing', 6);layoutOptions.setPanesOptions(panes);...}public LayoutOptions getLayoutOptions() {return layoutOptions;}
}
享受CDI的乐趣!
参考: JSF –我们的JCG合作伙伴 Oleg Varaksin在软件开发博客上的想法中 渴望CDI bean 。
翻译自: https://www.javacodegeeks.com/2013/02/jsf-eager-cdi-beans.html