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