Статьи

JSF — Eager CDI

В JSF 2 всем известны готовые управляемые бины. @ManagedBean имеет нетерпеливый атрибут. Если eager = ‘true’ и область действия — приложение, то этот компонент должен быть создан при запуске приложения, а не во время первой ссылки на компонент. Это хорошая функция, когда вы хотите загрузить данные области приложения (например, некоторые элементы меню) во время запуска приложения, чтобы повысить производительность во время выполнения.

1
2
3
4
5
@ManagedBean(eager=true)
@ApplicationScoped
public class GlobalBean {
    ...
}

Аннотация @ManagedBean будет устаревшей с JSF 2.2. Настоятельно рекомендуется использовать компоненты CDI (контекстно-зависимая инъекция) в среде JEE. Но что эквивалентно готовым управляемым компонентам в CDI? Ну, CDI является гибким, вы можете написать портативные расширения CDI . Я спросил у Томаса Андрашко, как это сделать. Томас является экспертом CDI, совладельцем PrimeFaces Extensions и участником проекта OpenWebBeans (OWB). Его совет заключался в том, чтобы реализовать такое расширение следующим образом:

1
2
3
4
5
6
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE})
public @interface Eager
{
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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. Использовать просто. Предположим, у нас есть компонент CDI LayoutController, который отвечает за всю конфигурацию макета. Мы можем аннотировать его с помощью @Eager и ускорить создание макета.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
@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 — Стремление к CDI-компонентам от нашего партнера по JCG Олега Вараксина в блоге « Мысли о разработке программного обеспечения» .