В JSF 2 всем известны готовые управляемые бины. @ManagedBean имеет нетерпеливый атрибут. Если eager = ‘true’ и область действия — приложение, то этот компонент должен быть создан при запуске приложения, а не во время первой ссылки на компонент. Это хорошая функция, когда вы хотите загрузить данные области приложения (например, некоторые элементы меню) во время запуска приложения, чтобы повысить производительность во время выполнения.
|
1
2
3
4
5
|
@ManagedBean(eager=true)@ApplicationScopedpublic 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@Namedpublic 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 Олега Вараксина в блоге « Мысли о разработке программного обеспечения» .