jsf绑定bean
每个人都知道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 bean
beanManager.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;
@PostConstruct
protected 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
jsf绑定bean