В 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 Олега Вараксина в блоге « Мысли о разработке программного обеспечения» .