MyFaces CODI создает экземпляры бобов дважды

Я перевожу приложение JSF 2.1 на CDI. Чтобы иметь возможность использовать @javax.faces.bean.ViewScoped аннотации, я пытаюсь использовать MyFaces CODI, как предложено здесь.

Приложение, кажется, работает как ожидалось, но я заметил, записав, что конструктор каждого из моих @Named Beans вызывается дважды, когда я впервые получаю к нему доступ. Однако их init() методы аннотированы @PostConstruct выполняются только один раз.

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

Это не происходит, как только я удаляю баночки MyFaces CODI из своего приложения, поэтому я уверен, что это вызвано этим.

Это нормальное поведение, и если да, то почему? Влияет ли это на производительность или это может вызвать проблемы?

Я чувствую, что это может быть связано с созданием прокси, но это не на 100% ясно, на мой взгляд, поэтому я был бы очень признателен за объяснение.

Моя конфигурация:

  • JSF 2.1
  • Мохарра 2.1.6
  • MyFaces CODI 1.0.5 (протестировано с полным комплектом или ядром + JSF 2.0+)
  • (не связано: Primefaces 3.5 и Omnifaces 1.5)
  • Glassfish 3.1.2, также протестирован на Jboss EAP 6.0 с такими же результатами

Благодарю.

2 ответа

Да, это все, что связано с созданием прокси, и это ожидаемое поведение с CDI. Смотрите это https://community.jboss.org/blogs/stuartdouglas/2010/10/12/weld-cdi-and-proxies, так как вы, вероятно, можете найти другие объяснения, которые говорят то же самое.

Но что касается того, почему это происходит с @javax.faces.bean.ViewScoped и CODI, то это потому, что CODI активирует расширение CDI, которое сканирует бины с помощью JSF ViewScope и заменяет его во время выполнения своей собственной реализацией на основе CDI.

@rdcrng правильно.

С CDI вам нужны методы @PostConstruct.

Другие вопросы по тегам