Myfaces CODI, @Inject и использование памяти - PullRequest
0 голосов
/ 01 декабря 2011

Я использую Myfaces CODI @ViewAccessScoped backing bean в моем приложении JSF.Одним из преимуществ является то, что мне не нужно использовать параметры представления для передачи информации между представлениями.Для записи @ViewAccessScoped гарантирует, что бин доступен до тех пор, пока первый запрос нового представления не получит к нему доступ.Возьмите этот случай, когда я хочу передать строковое значение со страницы 1 на страницу 2:

Page1Bean.java (вспомогательный компонент для page1.xhtml)

@Inject private Page2Bean page2Bean;
private String source = "Hello, World!";

...
page2Bean.setTarget(source);

Page2Bean.java (вспомогательный компонент для page2.xhtml)

private String target;

Если я перехожу прямо со страницы 1 на страницу 2, то при доступе к # {page2Bean.target} со страницы 2 он имеет значение «привет, мир!».

Фактически я перемещаю данные из представления page1 в представление page2.Другой вариант заключается в извлечении данных из представления page1 в представление page2, поэтому в Page2Bean я @Inject Page1Bean и @ViewAccessScoped обеспечивает мне доступ к page1Bean.getSource () (если он был в предыдущем представлении).

Это все хорошо, но в реальном мире я могу захотеть перейти со страницы 1 на любую из нескольких других страниц, в зависимости от ввода пользователя.Итак, Page1Bean.java выглядит так:

Page1Bean.java (исправлено)

@Inject private Page2Bean page2Bean;
@Inject private Page3Bean page3Bean;
@Inject private Page4Bean page4Bean;
@Inject private Page5Bean page5Bean;
@Inject private Page6Bean page6Bean;
@Inject private Page7Bean page7Bean;
@Inject private Page8Bean page8Bean;

Теперь мой вопрос: всегда ли объем памяти page1Bean включает в себя page2Bean- page8Bean?или память будет использоваться только в том случае, если я получу доступ к одному из компонентов @ Inject во время выполнения?

Надеюсь, это не слишком наивный вопрос, но я не совсем уверен, как он будет работать, и еслиответ на первый вопрос - да, я более или менее использую @SessionScoped!.

Спасибо за любые разъяснения.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Нет реальной памяти. Генерируются только прокси. Это причина для вызова конструктора. Вам не нужно разрешать бобы вручную!

Вам не нужно вводить все бобы. Вы используете это неправильно. Простое сохранение состояния между _ независимыми _ страницами должно выполняться через @WindowScoped. Если они не независимы, используйте компоненты на целевой странице (если вам не нужны обратные вызовы контроллера представления на целевых страницах).

0 голосов
/ 02 декабря 2011

Что ж, я полагаю, это было довольно очевидно на самом деле, но, добавив некоторую регистрацию в конструкторы bean-компонентов, которые вводились с помощью @Inject, я мог видеть, что все они были созданы при создании экземпляра Page1Bean, то есть при переходе к Страница 1. Я нашел решение в разделе 5.6 Спецификации CDI JSR-299. Программный поиск:

@Inject private Instance<Page2Bean> page2BeanDynamic;
...
if(someCondition) {
  Page2Bean page2Bean = page2BeanDynamic.get();
  page2Bean.setTarget(source);
}

так что это в основном динамический @Inject и гарантирует, что я использую только бины во время выполнения при необходимости.

Помещение методов finalize () и @PreDestroy в Page2Bean. Я вижу, что они оба вызываются, когда переход от страницы 2 к странице 1, как и ожидалось.

...