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):

Wypadkiem 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.

Dlaczego? Nie podają żadnego uzasadnienia. Używam @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ę.
Author: Tiny, 2010-12-03

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.

 59
Author: Bozho,
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.

Tutaj wpisz opis obrazka


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.

[[38]}przynajmniej w JSF 2.0/2.1 główną wadą zarządzania zapleczem JSF przez CDI jest to, że nie ma odpowiednika CDI @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?

 163
Author: BalusC,
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.
 13
Author: h2mch,
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.

 2
Author: AlanObject,
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.

Http://seamframework.org/Seam3/FacesModule

 0
Author: wrschneider,
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