Использовать 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
подходит близко, но все же требует ручного запуска и остановки и добавляет к исходным URL-адресам ужасный параметр запроса cid
.MyFaces CODI делает это проще благодаря прозрачной привязке JSF javax.faces.bean.ViewScoped
к CDI, так что вы можете просто сделать @Named @ViewScoped
, однако, который добавляет некрасивый параметр запроса windowId
к конечным URL-адресам, в том числе при простой навигации по страницам. OmniFaces решает все это с истинным CDI @ViewScoped
, который действительно связывает область действия компонента с состоянием представления JSF вместо произвольного параметра запроса.
JSF 2.2 (который выпускается через 3 года после этого вопроса / ответа) предлагает новую полностью совместимую с CDI аннотацию @ViewScoped
из коробки с ароматом javax.faces.view.ViewScoped
.JSF 2.2 даже поставляется с CDI-@FlowScoped
, который не имеет эквивалента @ManagedBean
, тем самым подталкивая пользователей JSF к CDI.Ожидается, что @ManagedBean
и друзья будут устаревшими согласно Java EE 8. Если вы все еще используете @ManagedBean
, поэтому настоятельно рекомендуем переключиться на CDI, чтобы подготовиться к будущим путям обновления.CDI легко доступен в контейнерах, совместимых с веб-профилем Java EE, таких как WildFly, TomEE и GlassFish.Для Tomcat вы должны установить его отдельно, точно так же, как вы уже сделали для JSF.См. Также Как установить CDI в Tomcat?