Użyj CDI.
Zgodnie z JSF 2.3 @ManagedBean
jest przestarzałe . Zobacz także wydanie specyfikacji 1417 . Oznacza to, że nie jest już powodem do wyboru @ManagedBean
ponad @Named
. Zostało to po raz pierwszy wdrożone w Mojarra 2.3.0 w wersji beta m06.
Historia
Podstawowa różnica polega na tym, że @ManagedBean
jest zarządzana przez framework JSF i jest @ManagedProperty
dostępna tylko dla innego zarządzanego komponentu bean JSF. @Named
jest zarządzany przez serwer aplikacji (kontener) poprzez CDI ram i jest poprzez @Inject
dostępny na każdym rodzaju pojemnika zarządzanej artefaktu jak @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, etc a nawet JSF @ManagedBean
. Z drugiej strony w sprawie, @ManagedProperty
czy nie działa Wewnątrz @Named
lub innego pojemnika zarządzanej artefaktu. Działa naprawdę tylko wewnątrz @ManagedBean
.
Inną różnicą jest to, że CDI faktycznie wstrzykuje serwery proxy delegujące do bieżącej instancji w zakresie docelowym na podstawie żądania / wątku (tak jak w przypadku wstrzykiwania EJB). Mechanizm ten pozwala na wstrzyknięcie ziarna o węższym zakresie do ziarna o szerszym zakresie, co nie jest możliwe w przypadku JSF @ManagedProperty
. JSF „wstrzykuje” tutaj fizyczną instancję bezpośrednio, wywołując metodę ustawiającą (dokładnie dlatego jest ona wymagana, podczas gdy nie jest to wymagane w przypadku @Inject
).
Chociaż nie jest to bezpośrednio wada - są inne sposoby - zakres @ManagedBean
jest po prostu ograniczony. Z drugiej strony, jeśli nie chcesz narażać się na zbyt wiele @Inject
, możesz po prostu zatrzymać zarządzaną fasolę @ManagedBean
. To jak w protected
porównaniu public
. Ale to się nie liczy.
Przynajmniej w JSF 2.0 / 2.1 główną wadą zarządzania komponentami typu bean obsługującymi JSF przez CDI jest brak odpowiednika formatu CDI @ViewScoped
. @ConversationScoped
Zbliża, ale nadal wymaga ręcznego uruchamiania i zatrzymywania i dołącza brzydki cid
parametr zapytania do adresów URL wyniku. MyFaces CODI ułatwia to poprzez w pełni przezroczyste mostkowanie JSF javax.faces.bean.ViewScoped
do CDI, więc możesz to zrobić @Named @ViewScoped
, jednak dołącza to brzydki windowId
parametr żądania do URL-i wynikowych wyników, również w zwykłej nawigacji między stronami. OmniFaces rozwiązuje to wszystko za pomocą prawdziwego CDI, @ViewScoped
który naprawdę wiąże zakres beana ze stanem widoku JSF zamiast z dowolnym parametrem żądania.
JSF 2.2 (który został wydany 3 lata po tym pytaniu / odpowiedzi) oferuje nową, w pełni kompatybilną z CDI @ViewScoped
adnotację w wersji javax.faces.view.ViewScoped
. JSF 2.2 jest nawet dostarczany z tylko CDI, @FlowScoped
który nie ma @ManagedBean
odpowiednika, popychając tym samym użytkowników JSF w kierunku CDI. Oczekuje się, że @ManagedBean
i znajomi zostaną wycofani zgodnie z Java EE 8. Jeśli nadal używasz @ManagedBean
, zdecydowanie zalecamy przejście na CDI, aby przygotować się na przyszłe ścieżki aktualizacji. CDI jest łatwo dostępny w kontenerach zgodnych z Java EE Web Profile, takich jak WildFly, TomEE i GlassFish. W przypadku Tomcata musisz zainstalować go osobno, dokładnie tak, jak to zrobiłeś dla JSF. Zobacz także Jak zainstalować CDI w Tomcat?