CDI не имеет области видимости, потому что не имеет понятия представления , поэтому, если вам нужна эта область, CDI в чистом виде не может этого сделать.Область видимости в основном означает область запроса + готовность к AJAX .Это не представление JSF, как страница с именем xyz.xhtml
, даже если вы видите JSF <f:viewParam>
и тому подобное.Частым случаем использования с bean-объектами видимости является как получить параметры GET в такой bean-компонент .Также прочитайте это .
Обратите внимание, что CDI скорее живет на уровне EJB / службы, чем на уровне JSF / представления. Этот блог имеет хороший обзор.
Таким образом, @ManagedBean
не может быть полностью заменен CDI, опять же, если вы используете @ViewScoped
bean - по крайней мере, без расширения CDI или с использованием модуля Seam 3 Faces .Использование bean-объектов в области видимости почти всегда происходит при использовании наборов GUI на основе AJAXed JSF 2, таких как RichFaces, PrimeFaces, IceFaces и т. Д.
Смешивание аннотаций из неправильных пакетов Java EE 6 может неожиданно доставит вам неприятности, опять же при использовании RichFaces или аналогичного API:
@javax.faces.bean.ManagedBean
@javax.faces.bean.[Jsf]Scoped
предназначены для компонентов, используемых исключительно на уровне представления, здесь RichFaces, PrimeFaces и т. д.Компоненты , похоже, имеют проблемы с вспомогательными компонентами, аннотированными CDI и JSF .Если вы получаете странное поведение от ваших bean-компонентов (или bean-компонентов, которые, похоже, ничего не делают), причиной может быть неправильное сочетание аннотаций.
Возможно смешивание JSF и CDI, например
@javax.inject.Named
@javax.faces.bean.[Jsf]Scoped
и работает в большинстве случаев при обращении со страниц JSF, однако существуют некоторые малоизвестные проблемы / недостатки, например, когда использует область JSF, для которой CDI не имеет :
Также комбинация @Named @ViewScoped
не будет работать как задумано.Специфичный для JSF @ViewScoped
работает в сочетании только со специфическим для JSF @ManagedBean
.Ваш CDI-специфичный @Named
будет вести себя как @RequestScoped
таким образом.Либо используйте @ManagedBean
вместо @Named
, либо используйте CDI-специфичные @ConversationScoped
вместо @ViewScoped
.
Тогда
@javax.inject.Named
@javax.faces.bean.[Cdi]Scoped
можно напрямую использовать для компонентов CDIссылки с ваших страниц JSF AFAIK.До сих пор у меня не было проблем с вышеуказанными комбинациями, поэтому вы можете считать @ManagedBean
устаревшим здесь.
Остался сервисный уровень, здесь в основном транзакционные EJB-сервисные бины, объявленные как
@javax.ejb.*
в основном @ javax.ejb.Stateless.Вы даже можете аннотировать и использовать EJB непосредственно со страниц JSF - хотя я не уверен, что этот дизайн желателен.Чтобы ссылаться (вставлять) любые компоненты, помеченные @ javax.ejb. *, Например, @Stateless
, предпочитайте @Inject
вместо @EJB
, как описано здесь .(Вероятно, предок этого ответа ...)
Наконец, очень хороший обзор аннотаций Java EE 6 можно найти здесь: http://www.physics.usyd.edu.au/~rennie/javaEEReferenceSheet.html
Примечание :Приведенная выше информация не от эксперта, а просто от моего взгляда новичков на эту смешную путаницу аннотаций Java EE 6 spaghetti .Больше понимания еще предстоит разработать.Я надеюсь, что этот ответ может быть общим, практическим ответом на эту путаницу - даже если он немного зашел в контексте исходного вопроса.