Используйте CDI.
Согласно JSF 2.3, @ManagedBean
не рекомендуется . См. Также выпуск спецификации 1417 . Это означает , что есть больше не причина , чтобы выбрать @ManagedBean
более @Named
. Впервые это было реализовано в бета-версии Mojarra 2.3.0 m06.
История
Основное отличие в том, что @ManagedBean
он управляется платформой JSF и @ManagedProperty
доступен только через другие управляемые компоненты JSF. @Named
управляются сервер приложений (контейнер) через рамки CDI и с помощью @Inject
доступны для любого вида контейнера управляемого артефакта , как @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, и т.д. , и даже JSF @ManagedBean
. С другой стороны , на, @ManagedProperty
это не работает в @Named
или любом другом контейнер управляемого артефакта. Работает реально только внутри@ManagedBean
.
Другое отличие состоит в том, что CDI фактически внедряет прокси, делегирующие текущему экземпляру в целевой области для каждого запроса / потока (например, как внедряются EJB). Этот механизм позволяет внедрить компонент с более узкой областью видимости в компонент с более широкой областью видимости, что невозможно с JSF @ManagedProperty
. JSF «вводит» сюда физический экземпляр напрямую, вызывая сеттер (именно поэтому сеттер требуется, в то время как это не требуется с@Inject
).
Хотя это и не является прямым недостатком - есть и другие способы - объем @ManagedBean
просто ограничен. С другой стороны, если вы не хотите раскрывать «слишком много» для @Inject
, вы также можете просто сохранить свои управляемые компоненты @ManagedBean
. Это как protected
против public
. Но это не в счет.
По крайней мере, в JSF 2.0 / 2.1 основным недостатком управления компонентами поддержки JSF с помощью CDI является отсутствие эквивалента CDI для @ViewScoped
. Примерно @ConversationScoped
подходит, но по-прежнему требует запуска и остановки вручную, и добавляет уродливый cid
параметр запроса к URL-адресам результатов. MyFaces CODI упрощает задачу, полностью прозрачно связывая JSF javax.faces.bean.ViewScoped
с CDI, так что вы можете просто сделать это @Named @ViewScoped
, однако это добавляет некрасивый windowId
параметр запроса к URL-адресам результатов, также при простой навигации между страницами. OmniFaces решает все это с помощью истинного CDI, @ViewScoped
который действительно связывает область действия bean-компонента с состоянием представления JSF, а не с произвольным параметром запроса.
JSF 2.2 (выпущенный через 3 года после этого вопроса / ответа) предлагает новую полностью совместимую с CDI @ViewScoped
аннотацию в формате javax.faces.view.ViewScoped
. JSF 2.2 даже поставляется с CDI-only, у @FlowScoped
которого нет @ManagedBean
эквивалента, тем самым подталкивая пользователей JSF к CDI. Ожидается, что @ManagedBean
в соответствии с Java EE 8 и друзья будут устаревшими. Если вы в настоящее время все еще используете @ManagedBean
, настоятельно рекомендуется перейти на CDI, чтобы быть готовым к будущим обновлениям. CDI легко доступен в контейнерах, совместимых с Java EE Web Profile, таких как WildFly, TomEE и GlassFish. Для Tomcat вам необходимо установить его отдельно, как и для JSF. См. Также Как установить CDI в Tomcat?