CDI Eager Application 作用域 bean

Sph*_*ynx 5 cdi jsf-2.2

由于@ManagedBean(eager = true)将被弃用,您如何创建一个急切的应用程序范围的 cdi bean

Sph*_*ynx 4

通过使用 CDI 扩展框架解决了这个问题:

  1. 创建预选赛:

    @Qualifier
    @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER,     ElementType.TYPE})
    @Retention(value = RetentionPolicy.RUNTIME)
    public @interface Eager {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用观察者方法创建扩展实现:

    public class EagerCDIExtension implements Extension {
    
            public void afterDeploymentValidation(@Observes AfterDeploymentValidation event, BeanManager beanManager) {
            beanManager.getBeans(Object.class, new AnnotationLiteral<Eager>() {
            }).parallelStream().filter(bean -> bean.getBeanClass().isAnnotationPresent(ApplicationScoped.class)).forEach(bean -> {
                beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean)).toString();
            });
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创造:META-INF/services/javax.enterprise.inject.spi.Extension

  4. 在上面的文件中注册扩展实现类,即:

    pypackage.EagerCDIExtension
    
    Run Code Online (Sandbox Code Playgroud)