Бэк-бобы (@ManagedBean) или CDI-бобы (@Named)?



Я только начал читать Core JavaServer Faces, 3-е изд. и они говорят, что это (выделено мной):




- Это историческая случайность, что есть два отдельных механизма, компоненты CDI
и JSF управляемые бобы, для бобов, которые могут быть использованы в страницах JSF. мы предлагаем
что вы используете CDI beans
если ваше приложение не должно работать на простом сервлете
бегун, таких как Tomcat.




почему? Они не обеспечивают любой обоснование. Я использую @ManagedBean для всех бобов в прототипе приложения, работающего на GlassFish 3, и я действительно не заметил никаких проблем с этим. Я не особенно против миграции из @ManagedBean до @Named, но я хочу знать почему я должен беспокоиться.

664   5  

5 ответов:

CDI является предпочтительным по сравнению с обычным для JSF, т. к. у CDI позволяет в JavaEE-широкое внедрение зависимостей. Вы также можете ввести POJOs и позволить им управляться. С JSF вы можете ввести только подмножество того, что вы можете с CDI.

используйте CDI.

согласно JSF 2.3,@ManagedBean и устаревший. Смотрите также spec выпуск 1417. Это означает, что больше нет причин выбирать @ManagedBean over @Named. Это было впервые реализовано в mojarra 2.3.0 beta version m06.

enter image description here


история

основная разница в том,@ManagedBean управляется JSF framework и только через @ManagedProperty доступно для других управляемых компонентов JSF. @Named управляется сервером приложений (контейнером) через CDI framework и через @Inject доступно для любого вида управляемого контейнером артефакта, например @WebListener,@WebFilter,@WebServlet,@Path,@Stateless, etc и даже JSF @ManagedBean. С другой стороны, @ManagedProperty тут не работать внутри @Named или любой другой контейнер управляет артефакт. Он работает действительно только внутри @ManagedBean.

другое отличие заключается в том, что CDI фактически вводит прокси, делегирующие текущему экземпляру в целевой области на основе каждого запроса/потока (например, как вводятся EJBs). Этот механизм позволяет вводить фасоль более узкой области в фасоль более широкой области, что невозможно с JSF @ManagedProperty. JSF "вводит" здесь физический экземпляр непосредственно путем вызова сеттера (именно поэтому требуется сеттер, в то время как это не требуется с @Inject).

хотя и не прямо недостаток - есть и другие способы-область @ManagedBean просто общества. С другой стороны, если вы не хотите выставлять "слишком много" для @Inject, вы также можете просто сохранить управляемые бобы @ManagedBean. Это как protected и public. Но это не считается.

по крайней мере, в JSF 2.0/2.1 основным недостатком управления JSF backing beans by CDI является то, что нет эквивалента CDI @ViewScoped. Элемент @ConversationScoped подходит близко, но все еще требует ручного запуска и остановки, и он добавляет уродливый cid параметр запроса к URL-адресам результатов. 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-only @FlowScoped не есть @ManagedBean эквивалент, тем самым подталкивая пользователей JSF к CDI. Ожидание заключается в том, что @ManagedBean и друзья будут устарели в соответствии с Java EE 8. Если вы все еще используете @ManagedBean, поэтому настоятельно рекомендуется переключиться на CDI, чтобы подготовиться к будущим путям обновления. CDI легко доступен в контейнерах, совместимых с веб-профилем Java EE, таких как WildFly, TomEE и GlassFish. Для Tomcat, вы должны установить его отдельно, точно так же, как вы уже сделали для JSF. Смотрите также Как установить CDI в Tomcat?

С Java EE 6 и CDI у вас есть другой вариант для управляемых бобов

  • @javax.faces.bean.ManagedBean относится к JSR 314 и был введен с JSF 2.0. Главной целью было избежать настройки в faces-config.xml-файл для использования компонента внутри страницы JSF.
  • @javax.annotation.ManagedBean(“myBean”) определяется JSR 316. Он обобщает управляемые компоненты JSF для использования в других местах Java EE
  • @javax.inject.Named(“myBean”) почти то же самое, что и выше, за исключением того, что вам нужны бобы.XML-файл в папка web/WEB-INF для активации CDI.

Я использовал CDI в GlassFish 3.0.1, но чтобы заставить его работать, мне пришлось импортировать каркас шва 3 (сварка). Это сработало довольно хорошо.

в GlassFish 3.1 CDI перестал работать, и сварной шов перестал работать с ним. Я открыл ошибка на этой но не видел еще. Мне пришлось преобразовать весь мой код в использование javax.сталкиваться.* аннотации, но я планирую вернуться к CDI, как только они заработают.

Я согласен, что вы должны использовать CDI, но один вопрос, что Я еще не видел, что делать с аннотацией @ViewScoped. У меня есть много кода, который зависит от него. Неясно, работает ли @ViewScoped, если вы не используете @ManagedBean с ним. Если кто-нибудь может прояснить это, я был бы признателен.

одна хорошая причина для перехода на CDI: у вас может быть общий ресурс с областью сеанса (например, профиль пользователя) @Inject ' ed в обоих JSF управляемых бобов и служб REST (т. е. Jersey/JAX-RS).

С другой стороны, @ViewScoped это веская причина, чтобы придерживаться JSF @ManagedBean - особенно для чего-либо со значительным AJAX. В CDI нет стандартной замены для этого.

кажется, что он может иметь некоторую поддержку @ViewScoped - как аннотации для CDI бобов, но я не играл с ним лично.

http://seamframework.org/Seam3/FacesModule

Comments

    Ничего не найдено.