2012-08-31 29 views
11

De acuerdo, entonces tengo un bean de respaldo JSF que necesita una referencia a otro bean (@NoneScoped).Inject vs ManagedProperty

¿Debería @Inject it o utilizar @ManagedProperty para obtener una referencia de instancia del contenedor?

¿Por qué utilizar una y no la otra? En mi opinión, los dos enfoques logran lo mismo.

Respuesta

10

@ManagedProperty y @NoneScoped viene de la especificación JSF 2.0, mientras que @Inject viene de la especificación CDI.

Si solo está trabajando en una aplicación de servlet que no utiliza ninguna de las otras características de JavaEE 6, vaya a @ManagedProperty. Esa anotación también tiene una ventaja contra @Inject: puede usar EL (lenguaje de expresión) con ella (although there are workarounds to get that in CDI).

Ambas anotaciones/contenedores parecen lograr "lo mismo" pero de maneras muy diferentes y funcionan con contenedores diferentes. Los frijoles manejados por CDI estarán disponibles para JSF pero no viceversa. Si anota sus beans con anotaciones específicas de JSF, entonces olvídese de usar calificadores personalizados, interceptores, métodos de productor, etc. Por lo general, prefiero el enfoque con CDI porque, al final, es más sofisticado, pero la elección dependerá de sus necesidades reales. .

envolviéndolo, ya que parece que usted está usando características JSF continuación palo al @ManagedProperty (CDI no puede entender @NoneScoped anotaciones, en CDI todos los granos están bajo el alcance @Default si no se especifica ninguno). Cambiar a CDI en su proyecto puede significar reemplazar no solo el @ManagedProperty por uno @Inject, sino todos sus @RequestScoped (y así sucesivamente) para los CDI-específicos.

6

Preferiría CDI sobre beans administrados siempre que sea posible. CDI es más rico en la verificación de dependencias en tiempo de despliegue y su soporte proxy evita la fuga de alcance. Esto hace que sea más fácil verificar la corrección de su modelo. Producers generalmente se puede usar para proporcionar código de cola cuando sea necesario.

+2

yo añadiría esto, similar a lo que está por debajo, que tienen cosas como EJB se puede inyectar con CDI. También puede mantenerlos fuera de su vista si no les da un @Name (que simplemente los pone a disposición de EL). Usar CDI también le da puntos de extensión mayores que los disponibles en JSF, pero eso no forma parte de la pregunta :) Sugiero seguir con CDI. – LightGuard

Cuestiones relacionadas