2012-08-31 11 views
11

Okej, więc mam komponent bean JSF, który potrzebuje odwołania do innej fasoli (@NoneScoped).Inject vs ManagedProperty

Czy mogę @Inject it lub użyć @ManagedProperty, aby uzyskać odwołanie do instancji z kontenera?

Po co używać jednego, a nie drugiego, w moim umyśle dwa podejścia osiągają to samo.

Odpowiedz

10

@ManagedProperty i @NoneScoped pochodzi ze specyfikacji JSF 2.0, natomiast @Inject pochodzi ze specyfikacji CDI.

Jeśli pracujesz nad aplikacją serwletów, która nie wykorzystuje żadnej z innych funkcji JavaEE 6, przejdź do wersji @ManagedProperty. Ta adnotacja ma także przewagę nad @Inject: możesz używać EL (język wyrażeń) z nią (although there are workarounds to get that in CDI).

Oba adnotacje/pojemniki zdają się zapewniać "to samo" "ale w bardzo różny sposób i działają z różnymi kontenerami. Fasola zarządzana przez CDI będzie dostępna dla JSF, ale nie viceversa. Jeśli opisujesz swoje fasole za pomocą adnotacji JSF, to zapomnij o zastosowaniu niestandardowych kwalifikatorów, przechwytujących, metodach producenta itp. Zazwyczaj wolę podejście z CDI, ponieważ na koniec jest ono bardziej wyrafinowane, ale wybór zależy od rzeczywistych potrzeb .

Owijanie go, jak się wydaje, że jesteś po prostu za pomocą JSF możliwości następnie kij do @ManagedProperty (CDI nie może zrozumieć @NoneScoped adnotacji w CDI wszystkie ziarna są objęte zakresem @Default jeśli żadna określona). Przejście na CDI w twoim projekcie może zastąpić nie tylko @ManagedProperty dla jednego @Inject, ale wszystkie twoje @RequestScoped (i tak dalej) dla specyficznych dla CDI.

6

Byłbym faworyzował CDI nad zarządzanymi fasolami kiedykolwiek to możliwe. CDI jest bogatszy w sprawdzanie zależności podczas wdrażania, a jego obsługa proxy zapobiega wyciekowi zakresu. Ułatwia to weryfikację poprawności modelu. Producers może generalnie służyć do dostarczania kodu kleju tam, gdzie jest to konieczne.

+2

Dodam to, podobnie jak to, co poniżej, trzeba takie rzeczy jak EJB można wstrzyknąć z CDI. Możesz także ukryć je przed wzrokiem, jeśli nie dasz im @Name (co po prostu sprawia, że ​​są one dostępne dla EL). Używanie CDI daje również punkty rozszerzenia większe niż to, co jest dostępne w JSF, ale to nie jest część pytania :) Sugeruję trzymanie się CDI. – LightGuard