Verwenden Sie CDI.
Gemäß JSF 2.3 @ManagedBean
ist 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 @ManagedBean
es vom JSF-Framework verwaltet wird und nur über @ManagedProperty
andere JSF-verwaltete Beans verfügbar ist. @Named
wird durch Anwendungsserver (der Behälter) über CDI Rahmen und ist über verwaltete zur @Inject
Verfü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, @ManagedProperty
wird nicht funktionieren innerhalb einer @Named
oder 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 @ManagedBean
einfach begrenzt. Aus der anderen Perspektive können Sie, wenn Sie nicht "zu viel" aussetzen möchten, @Inject
auch einfach Ihre verwalteten Bohnen behalten @ManagedBean
. Es ist wie protected
gegen 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 @ConversationScoped
kommt nahe, erfordert aber immer noch das manuelle Starten und Stoppen und hängt einen hässlichen cid
Anforderungsparameter an die Ergebnis-URLs an. MyFaces CODI macht es einfacher, indem JSFs vollständig transparent javax.faces.bean.ViewScoped
mit CDI verbunden werden, sodass Sie dies einfach tun können. Dabei @Named @ViewScoped
wird jedoch ein hässlicher windowId
Anforderungsparameter 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, @ViewScoped
die 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 @ViewScoped
Annotation im Geschmack von javax.faces.view.ViewScoped
. JSF 2.2 wird sogar mit einem CDI-only geliefert, @FlowScoped
das kein @ManagedBean
Äquivalent hat, wodurch JSF-Benutzer in Richtung CDI gedrängt werden. Es wird erwartet, dass @ManagedBean
Freunde 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?