Використовуйте CDI.
Відповідно з JSF 2.3, @ManagedBean
є застарілим . Дивіться також специфікацію випуску 1417 . Це означає , що є більше не причина , щоб вибрати @ManagedBean
більш @Named
. Це було вперше реалізовано в бета-версії m06r Mojarra 2.3.0.
Історія
Основна відмінність полягає в тому, що @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
який дійсно прив'язує область бобу до стану перегляду 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?