Бэк-бобы (@ManagedBean) или CDI-бобы (@Named)?
Я только начал читать Core JavaServer Faces, 3-е изд. и они говорят, что это (выделено мной):
- Это историческая случайность, что есть два отдельных механизма, компоненты CDI
и JSF управляемые бобы, для бобов, которые могут быть использованы в страницах JSF. мы предлагаем
что вы используете CDI beans если ваше приложение не должно работать на простом сервлете
бегун, таких как Tomcat.
почему? Они не обеспечивают любой обоснование. Я использую @ManagedBean для всех бобов в прототипе приложения, работающего на GlassFish 3, и я действительно не заметил никаких проблем с этим. Я не особенно против миграции из @ManagedBean до @Named, но я хочу знать почему я должен беспокоиться.
5 ответов:
CDI является предпочтительным по сравнению с обычным для JSF, т. к. у CDI позволяет в JavaEE-широкое внедрение зависимостей. Вы также можете ввести POJOs и позволить им управляться. С JSF вы можете ввести только подмножество того, что вы можете с CDI.
используйте CDI.
согласно JSF 2.3,
@ManagedBeanи устаревший. Смотрите также spec выпуск 1417. Это означает, что больше нет причин выбирать@ManagedBeanover@Named. Это было впервые реализовано в mojarra 2.3.0 beta version m06.
история
основная разница в том,
@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 упрощает работу, полностью прозрачно соединяя JSFjavax.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 бобов, но я не играл с ним лично.

Comments