Используйте 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?