2012-02-10 16 views
12

Tengo una pregunta acerca de la @Inject anotación en Java EE 6:Java EE 6: @Inject y <T> Instancia

¿Cuál es la diferencia entre:

@Inject 
private TestBean test; 

@Inject 
private Instance<TestBean> test2; 

Para tener la referencia:

test2.get(); 

Algunas informaciones sobre Instancia: http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

Tal vez no crea el objeto hasta que lo llama get()? Solo quería saber cuál es mejor para la memoria jvm. Creo que directo @Inject creará directamente una instancia del objeto, incluso si no se utiliza por la aplicación ...

¡Gracias!

+1

¿Fue suficiente mi respuesta o es posible que malinterprete su pregunta? Si por casualidad lo encontró útil, no olvide votarlo y/o marcarlo como aceptado. ¡Gracias! –

Respuesta

6

La segunda es lo que se llama inyección diferida o inicialización. Su contenedor elegirá hacer el trabajo de localizar, inicializar e inyectar el objeto adecuado para TestBean hasta que llame a get() en la mayoría de los casos.

En cuanto a "cuál es mejor", debe remitirse a las reglas de optimización. No optimices hasta que tengas un problema y utiliza un generador de perfiles.

En otras palabras, use la primera a menos que pueda probar definitivamente que la segunda le está ahorrando cantidades significativas de memoria y CPU.

¡Avísame si eso responde tu pregunta!

+0

Thx por la respuesta, de hecho yo quería utilizar esto para el marco Vaadin (basado en GWT) y yo quería saber si la colocación de todos los componentes de interfaz de usuario como Inyectar matará performences como: @Inject pantalla de inicio de sesión LoginScreen De hecho, al inicio de la aplicación, cargará todas las inyecciones en el jvm, lo que puede causar menos ejecuciones si el usuario no las usa ... – jihedMaster

+1

Honestamente dudo que vea un impacto en el rendimiento de la inyección directa.¡Yo iría por esa ruta con seguridad y no arriesgaría la deuda técnica! He escrito aplicaciones masivas de DI inyectadas con más de 50 granos en primavera y vi poco impacto de DI. –

+0

¿Quiere decir que hacer muchas anotaciones de Inyección en jee 6 no disminuye los resultados para el cliente? – jihedMaster

10

Para más información sobre los casos de uso, por ejemplo, se puede encontrar en la documentación:

En ciertas situaciones, la inyección no es la forma más conveniente para obtener una referencia contextual. Por ejemplo, no se puede usar cuando:

  • el tipo de frijoles o calificadores varían dinámicamente en tiempo de ejecución
  • no puede ser no bean que satisface el tipo y la fase de clasificación
  • nos gustaría iterar sobre todo habas de un cierto tipo

Esto está muy bien para que pueda hacer algo como

@Inject @MyQualifier Instance<MyType> allMycandidates; 

Para que pueda obtener un iterador de todos mis candidatos e iterar sobre todos los objetos calificados.