Verwenden Sie CDI.
Gemäß JSF 2.3 @ManagedBeanist veraltet . Siehe auch Spezifikationsausgabe 1417 . Dies bedeutet , dass es nicht mehr ein Grund , wählen @ManagedBeanüber @Named. Dies wurde erstmals in der Beta-Version m06 von Mojarra 2.3.0 implementiert.

Geschichte
Der Hauptunterschied besteht darin, dass @ManagedBeanes vom JSF-Framework verwaltet wird und nur über @ManagedPropertyandere JSF-verwaltete Beans verfügbar ist. @Namedwird durch Anwendungsserver (der Behälter) über CDI Rahmen und ist über verwaltete zur @InjectVerfügung , um jede Art von einem Container verwaltet Artefakt wie @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, etc. und sogar ein JSF @ManagedBean. Von der anderen Seite auf, @ManagedPropertywird nicht funktionieren innerhalb einer @Namedoder einem anderen Container verwaltet Artefakt. Es funktioniert wirklich nur drinnen @ManagedBean.
Ein weiterer Unterschied besteht darin, dass CDI tatsächlich Proxys, die an die aktuelle Instanz delegiert werden, im Zielbereich pro Anforderung / Thread injiziert (z. B. wie EJBs injiziert wurden). Dieser Mechanismus ermöglicht das Injizieren einer Bean eines engeren Bereichs in eine Bean eines breiteren Bereichs, was mit JSF nicht möglich ist @ManagedProperty. JSF "injiziert" hier die physische Instanz direkt durch Aufrufen eines Setters (genau deshalb ist auch ein Setter erforderlich, während dies bei nicht erforderlich ist @Inject).
Obwohl dies nicht direkt ein Nachteil ist - es gibt andere Möglichkeiten -, ist der Umfang @ManagedBeaneinfach begrenzt. Aus der anderen Perspektive können Sie, wenn Sie nicht "zu viel" aussetzen möchten, @Injectauch einfach Ihre verwalteten Bohnen behalten @ManagedBean. Es ist wie protectedgegen public. Das zählt aber nicht wirklich.
Zumindest in JSF 2.0 / 2.1 besteht der Hauptnachteil der Verwaltung von JSF-Backing-Beans über CDI darin, dass es kein CDI-Äquivalent zu gibt @ViewScoped. Das @ConversationScopedkommt nahe, erfordert aber immer noch das manuelle Starten und Stoppen und hängt einen hässlichen cidAnforderungsparameter an die Ergebnis-URLs an. MyFaces CODI macht es einfacher, indem JSFs vollständig transparent javax.faces.bean.ViewScopedmit CDI verbunden werden, sodass Sie dies einfach tun können. Dabei @Named @ViewScopedwird jedoch ein hässlicher windowIdAnforderungsparameter an die Ergebnis-URLs angehängt , auch bei der einfachen Vanilla-Navigation von Seite zu Seite. OmniFaces löst dies alles mit einer echten CDI, @ViewScopeddie den Gültigkeitsbereich der Bean wirklich an den JSF-Ansichtsstatus anstatt an einen beliebigen Anforderungsparameter bindet.
JSF 2.2 (das 3 Jahre nach dieser Frage / Antwort veröffentlicht wird) bietet eine neue, vollständig CDI-kompatible @ViewScopedAnnotation im Geschmack von javax.faces.view.ViewScoped. JSF 2.2 wird sogar mit einem CDI-only geliefert, @FlowScopeddas kein @ManagedBeanÄquivalent hat, wodurch JSF-Benutzer in Richtung CDI gedrängt werden. Es wird erwartet, dass @ManagedBeanFreunde gemäß Java EE 8 veraltet sind. Wenn Sie derzeit noch verwenden @ManagedBean, wird dringend empfohlen, auf CDI zu wechseln, um sich auf zukünftige Upgrade-Pfade vorzubereiten. CDI ist in Java EE Web Profile-kompatiblen Containern wie WildFly, TomEE und GlassFish verfügbar. Für Tomcat müssen Sie es separat installieren, genau wie Sie es bereits für JSF getan haben. Siehe auch Wie installiere ich CDI in Tomcat?