Backing beans (@ManagedBean) czy CDI Beans (@Named)?
Właśnie zacząłem czytać core JavaServer Faces, 3rd Ed. i mówią tak (podkreślenie moje):
Dlaczego? Nie podają żadnego uzasadnienia. UżywamWypadkiem historycznym jest to, że istnieją dwa odrębne mechanizmy, i JSF managed beans, dla fasoli, które mogą być używane na stronach JSF. proponujemy że używasz CDI beans, chyba że Twoja aplikacja musi działać na zwykłym serwletie biegacz taki jak Tomcat.
@ManagedBean
dla wszystkich fasoli w prototypowej aplikacji działającej na GlassFish 3, i tak naprawdę nie zauważyłem żadnych problemów z tym. Nie przeszkadza mi migracja z @ManagedBean
do @Named
, ale chcę wiedzieć , dlaczego powinienem zawracać sobie głowę. 5 answers
CDI jest preferowane od zwykłego JSF, ponieważ CDI pozwala na wstrzykiwanie zależności w JavaEE. Można również wstrzykiwać Pojo i pozwolić im zarządzać. Z JSF można wstrzyknąć tylko podzbiór tego, co można z CDI.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 16:36:45
Użyj CDI.
Zgodnie z JSF 2.3, @ManagedBean
jest przestarzałe . Zobacz też spec issue 1417. Oznacza to, że nie ma już powodu, aby wybrać @ManagedBean
zamiast @Named
. Zostało to po raz pierwszy zaimplementowane w Mojarra 2.3.0 beta wersji M06.
Historia
Podstawowa różnica to, @ManagedBean
jest zarządzany przez JSF framework i jest tylko za pośrednictwem @ManagedProperty
dostępne dla innego JSF managed beans. @Named
jest zarządzany przez serwer aplikacji (kontener) poprzez framework CDI i jest przez @Inject
dostępne dla każdego rodzaju kontenera zarządzanego artefaktem jak @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, itd, a nawet JSF @ManagedBean
. Z drugiej strony @ManagedProperty
Nie Działa wewnątrz @Named
lub innego artefaktu zarządzanego przez kontener. Działa naprawdę tylko wewnątrz @ManagedBean
.
Inną różnicą jest to, że CDI faktycznie wstrzykuje proxy delegujące do bieżącej instancji w zakresie docelowym na podstawa na żądanie / wątek(jak w jaki sposób EJB są wstrzykiwane). Mechanizm ten pozwala na wstrzyknięcie fasoli o węższym zakresie do fasoli o szerszym zakresie, co nie jest możliwe przy użyciu JSF @ManagedProperty
. JSF "wstrzykuje" tutaj fizyczną instancję bezpośrednio przez wywołanie settera(dlatego też jest to wymagane, podczas gdy jest to , a nie wymagane przez @Inject
).
Choć nie bezpośrednio wadą - są inne sposoby - zakres @ManagedBean
jest po prostu Ograniczony. Z innej perspektywy, jeśli nie chcesz ujawniać "zbyt wiele" dla @Inject
, Możesz również zachować swoje zarządzane fasolki @ManagedBean
. To jak protected
kontra public
. Ale to się nie liczy.
@ViewScoped
. @ConversationScoped
zbliża się, ale nadal wymaga ręcznego uruchamiania i zatrzymywania i dołącza brzydki parametr cid
request do adresów URL wyników. MyFaces CODI ułatwia w pełni transparentny pomostowanie javax.faces.bean.ViewScoped
JSF do CDI, dzięki czemu możesz po prostu zrobić @Named @ViewScoped
, jednak dodaje brzydki parametr windowId
request do adresów URL wyników, również przy zwykłej nawigacji strona-strona. OmniFaces rozwiązuje to wszystko za pomocą prawdziwego CDI @ViewScoped
co naprawdę wiąże zakres Beana ze stanem widoku JSF zamiast z arbitralnym parametrem żądania.
JSF 2.2 (który jest wydany 3 lata po tym pytaniu/odpowiedzi) oferuje nową w pełni kompatybilną z CDI @ViewScoped
adnotację w pudełku w smaku javax.faces.view.ViewScoped
. JSF 2.2 jest również wyposażony w CDI-only @FlowScoped
, który nie ma odpowiednika @ManagedBean
, co popycha użytkowników JSF w kierunku CDI. Oczekuje się, że @ManagedBean
i przyjaciele będą deprecated zgodnie z Java EE 8. Jeśli obecnie nadal używasz @ManagedBean
, zdecydowanie zalecamy przejście na CDI, aby być przygotowanym na przyszłe ścieżki aktualizacji. CDI jest łatwo dostępne w kontenerach zgodnych z Java EE Web Profile, takich jak WildFly, TomEE i GlassFish. W przypadku programu Tomcat musisz zainstalować go osobno, dokładnie tak jak już zrobiłeś dla JSF. Zobacz także jak zainstalować CDI w Tomcat?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-04 09:09:08
Z Java EE 6 i CDI masz inną opcję dla Managed Beans
-
@javax.faces.bean.ManagedBean
odnosi się do JSR 314 i został wprowadzony z JSF 2.0. Głównym celem było uniknięcie konfiguracji w faces-config.plik xml do użycia bean wewnątrz strony JSF. -
@javax.annotation.ManagedBean(“myBean”)
jest zdefiniowany przez JSR 316. JSF jest jednym z najbardziej popularnych programów w Javie EE.]} -
@javax.inject.Named(“myBean”)
są prawie takie same, jak ten powyżej, z tym, że potrzebujesz fasoli.plik xml w folderze web/WEB-INF do aktywacji CDI.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 10:55:49
Używałem CDI w GlassFish 3.0.1, ale aby go uruchomić, musiałem zaimportować Seam 3 framework (Weld). To zadziałało całkiem nieźle.
W GlassFish 3.1 CDI przestał działać, a Spoina szwu przestała z nim pracować. Otworzyłem błąd na tym, ale nie widziałem go jeszcze naprawionego. Musiałem przekonwertować cały mój kod na javax.twarze.* adnotacje, ale planuję wrócić do CDI, gdy już go uruchomią.
Zgadzam się, że powinieneś używać CDI, ale jednego problemu nie widziałem resolved yet to co zrobić z adnotacją @ViewScoped. Mam dużo kodu, który od tego zależy. Nie jest jasne, czy @Viewscoped działa, jeśli nie używasz z nim @ManagedBean. Jeśli ktoś może to wyjaśnić, byłbym wdzięczny.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-25 02:00:46
Jeden dobry powód, aby przejść do CDI: możesz mieć wspólny zasób z zakresem sesji (na przykład profil użytkownika) @Inject
'ed zarówno w zarządzanych fasolach JSF, jak i usługach REST (np. Jersey / JAX-RS).
Z drugiej strony, @ViewScoped
jest przekonującym powodem, aby trzymać się JSF @ManagedBean
- szczególnie dla wszystkiego, co ma znaczący AJAX. Nie ma standardowego zamiennika dla tego w CDI.
Wydaje się, że może mieć jakieś wsparcie dla @ViewScoped
- Jak adnotacji dla CDI fasoli, ale nie grałem z nim osobiście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 13:54:02