jsf绑定bean_JSF –渴望的CDI bean

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值