Sichern Bohnen (@ManagedBean) oder CDI Beans (@Named)?
Frage
Ich habe gerade angefangen Lesen durch Core-Javaserver Faces, 3. Aufl. und sie sagen, dass dies (Hervorhebung von mir ):
Es ist ein historischer Zufall, dass es zwei separate Mechanismen, CDI Bohnen und JSF verwaltet Bohnen, für Bohnen, die in JSF-Seiten verwendet werden kann. Wir empfehlen dass Sie verwenden CDI Bohnen , es sei denn Ihre Anwendung muss Arbeit auf einem einfachen Servlet Läufer wie Tomcat.
Warum? Sie bieten keine alle Begründung. Ich habe für alle Bohnen in einer Prototyp-Anwendung mit @ManagedBean
auf Glassfish läuft 3, und ich habe wirklich keine Probleme mit diesem bemerkt. Ich schon gar nicht etwas dagegen von @ManagedBean
zu @Named
migrieren, aber ich möchte wissen, Warum sollte ich die Mühe, .
Lösung
CDI über Normal JSF bevorzugt, da CDI ermöglicht JavaEE weite Dependency Injection. Sie können auch POJOs injizieren und lassen Sie sie verwaltet werden. Mit JSF können Sie nur inject eine Teilmenge von dem, was können Sie mit CDI.
Andere Tipps
Verwendung CDI.
Wie pro JSF 2.3, ist @ManagedBean
deprecated . Siehe auch spec Ausgabe 1417 . Dies bedeutet, dass es nicht mehr ein Grund @ManagedBean
über @Named
zu wählen. Dies wurde zuerst in Mojarra 2.3.0 Beta-Version m06 implementiert.
Geschichte
Der Kern Unterschied ist, @ManagedBean
von JSF-Framework verwaltet und ist nur über @ManagedProperty
zu einem anderen JSF Managed beans zur Verfügung. @Named
wird durch Anwendungsserver (der Behälter) verwaltet über und CDI Rahmen ist über @Inject
zur Verfügung, um jede Art von ein Container verwaltet Artefakt wie @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, etc. und sogar ein JSF @ManagedBean
. Von der anderen Seite auf, @ManagedProperty
tut nicht Arbeit in einem @Named
oder einen anderen Container verwaltet Artefakt. Es funktioniert wirklich nur innerhalb @ManagedBean
.
Ein weiterer Unterschied besteht darin, dass tatsächlich CDI Proxies Delegieren der aktuellen Instanz im Zielbereich einspritzt auf einer Pro-Anfrage / Thread-Basis (wie als wie EJBs injiziert worden ist). Dieser Mechanismus ermöglicht es in einer Bohne eines breiteren Anwendungsbereich eine Bohne von einem engeren Rahmen Injektion, was nicht möglich mit JSF @ManagedProperty
ist. JSF „spritzt“ hier die physikalische Instanz direkt durch einen Setter aufgerufen wird (die auch genau deshalb ein Setter erforderlich ist, während das ist nicht mit @Inject
erforderlich).
Zwar nicht direkt ein Nachteil - es andere Wege gibt - der Umfang des @ManagedBean
ist einfach begrenzt. Aus der anderen Perspektive, wenn man „zu viel“ für @Inject
nicht verfügbar machen möchten, können Sie auch Ihre verwalteten Bohnen @ManagedBean
einfach weiter. Es ist wie protected
gegen public
. Aber das ist nicht wirklich zählen.
Zumindest in JSF 2.0 / 2.1, der große Nachteil von CDI JSF Träger Bohnen Verwaltung ist, dass es keine CDI Äquivalent @ViewScoped
. Die @ConversationScoped
nahe kommt, erfordert aber immer noch manuell starten und stoppen und es fügt ein hässlichen cid
Anforderungsparameter zu Ergebnis URLs. MyFaces CODI macht es ganz einfacher durch die transparente JSF des javax.faces.bean.ViewScoped
zu CDI Überbrückung, so dass Sie nur @Named @ViewScoped
tun können, aber dass eineine hässlichen windowId
Anforderungsparameter zu Ergebnis URLs anhängt, auch auf Plain-Vanilla-Seite-zu-Seite-Navigation. OmniFaces löst dies alles mit einem echten CDI @ViewScoped
, die wirklich der zu einem beliebigen Anfrage statt Parametern Umfang JSF Ansichtszustand des bean bindet.
JSF 2.2 (die 3 Jahre nach dieser Frage / Antwort freigegeben wird) bietet eine neue, vollständig CDI kompatibel @ViewScoped
Anmerkung aus der Box in Geschmack von javax.faces.view.ViewScoped
. 2.2 JSF kommt auch zusammen mit einem CDI-only @FlowScoped
, die keine @ManagedBean
Äquivalent hat, hiermit JSF Nutzer gegenüber CDI schieben. Die Erwartung ist, dass @ManagedBean
und Freunde werden per Java EE 8. veraltet Wenn Sie derzeit noch @ManagedBean
verwenden, ist es daher dringend CDI b zu wechseln empfehlene vorbereitet für Pfade Zukunft zu aktualisieren. CDI ist in Java EE Web Profile kompatibel Behälter, wie Wildfly, TomEE und Glassfish leicht verfügbar. Für Tomcat, müssen Sie es separat installieren, genau so, wie Sie bereits für JSF tat. Siehe auch Wie installiert CDI in Tomcat?
Mit Java EE 6 und CDI haben Sie verschiedene Optionen für Managed Beans
-
@javax.faces.bean.ManagedBean
ist auf JSR 314 beziehen und wurde mit JSF 2.0 eingeführt. Das Hauptziel war es, die Konfiguration in der faces-config.xml-Datei zu vermeiden, dass die Bohnen innerhalb einer JSF Seite zu verwenden. -
@javax.annotation.ManagedBean(“myBean”)
ist definiert durch JSR 316. Es verallgemeinert die JSF Bohnen verwaltet für den Einsatz an anderer Stelle in Java EE -
@javax.inject.Named(“myBean”)
sind fast die gleichen, wie die oben, außer dass Sie eine beans.xml Datei im Web / WEB-INF-Ordner müssen CDI aktivieren.
Ich war mit CDI in Glassfish 3.0.1, aber bekommen es ich zur Arbeit hatte die Naht 3 Rahmen (Weld) zu importieren. Das funktionierte ziemlich gut.
In Glassfish 3.1 CDI aufgehört zu arbeiten, und die Schweißnaht gestoppt, damit zu arbeiten. Ich öffnete einen Fehler auf dieser aber habe es nicht fixiert noch nicht gesehen. Ich hatte alle meine Codes mit dem javax.faces zu konvertieren. * Anmerkungen aber ich plane zu CDI zurück zu bewegen, wenn sie es bekommen zu arbeiten.
Ich bin damit einverstanden Sie CDI benutzen sollten, aber ein Problem, dass ich noch nicht behoben ist gesehen, was mit der @ViewScoped Anmerkung zu tun. Ich habe eine Menge von Code, der davon abhängt. Es ist nicht klar, ob @ViewScoped funktioniert, wenn Sie nicht @ManagedBean mit ihm arbeiten. Wenn jemand dies klären kann ich würde es zu schätzen wissen.
Ein guter Grund zu CDI zu bewegen: Sie haben eine gemeinsame Sitzung-scoped Ressource haben könnten (Benutzerprofil zum Beispiel) in beide JSF Managed Beans und REST-Service @Inject
'ed (dh Jersey / JAX-RS)
Auf der anderen Seite ist @ViewScoped
ein zwingender Grund mit JSF @ManagedBean
zu bleiben - vor allem für alles, was mit erheblichem AJAX. Es gibt keinen Standard-Ersatz für den in CDI.
Es scheint, dass es für CDI Bohnen eine gewisse Unterstützung für eine @ViewScoped
artige Anmerkung haben kann, aber ich habe nicht mit ihm persönlich gespielt.