jpa-2.0 java-ee-6 ejb-3.1

jpa 2.0 - Cuál es la diferencia entre @Inject y @EJB



jpa-2.0 java-ee-6 (3)

  1. @EJB inyecta solo EJB, pero @Inject se puede usar para inyectar POJO en lugar de EJB. Sin embargo, @Inject requiere que su archivo sea un BDA (contenga beans.xml para EE 6, o implícitamente en EE 7). @Inject también tiene capacidades adicionales CDI-específicas (ámbitos, interceptores, etc.), pero esas capacidades incurren en gastos adicionales. Los servidores de aplicaciones tienen soporte para especificar enlaces de @EJB para que un implementador pueda elegir el EJB objetivo, pero @Inject solo permite que el desarrollador de la aplicación elija el EJB de destino (y debe existir en la aplicación).

  2. Si el objetivo no es un EJB, entonces no debes usar @EJB.

  3. Depende de si está realizando múltiples consultas interrelacionadas y luego intenta tomar decisiones comerciales. Debe comprender los niveles de aislamiento y tenerlos en cuenta, incluso para las operaciones de solo lectura.

Actualmente estoy aprendiendo los nuevos modelos de componentes de Java EE 6 y estoy confundido con el último mecanismo de inyección de dependencias. Asi que aqui están mis preguntas:

1) ¿Cuál es la diferencia entre @Inject y @EJB

2) Si tengo un POJO simple que contiene otros POJO (¿cuál de ellos es el código DAO), cuál sería la mejor opción: @Inject o @EJB?

¿Puedo mezclar @Inject y @EJB?

Un ejemplo sería:

  • ClassA implementa InterfaceA y tiene una instancia de ClassA_Adaptor

  • ClassA_Adaptor implementa InterfaceAB y tiene una instancia de ClassB

  • ClassB implementa InterfaceB y tiene una instancia de ClassB_Adaptor y una instancia DAO_ClassB

  • ClassB_Adaptor implementa InterfaceB y tiene una instancia de ClassC

  • ClassC implementa InterfaceBC y tiene una instancia de WebService_ClassC

  • DAO_ClassB usará JPA 2.0 (@PersistenceContext)

Me gustaría inyectarlos todos, incluidos DAO y WebService.

3) ¿Es un mal enfoque usar transaccionalmente solo para ciertas operaciones pero no para todas?

Como ejemplo: algunos métodos en DAO_ClassB son su consulta típica, mientras que otros métodos son métodos de "escritura". ¿Es malo no ajustar los métodos de "LEER" con la transacción?

A mi entender, el DAO_ClassB puede ser envuelto con transacción usando @EJB (inyectar el DAO_ClassB y hacer que todos los métodos sean transaccionales). ¿Cómo puedo controlarlo?

Lo siento si algunas de las preguntas son confusas porque solo conozco algunas partes del nuevo modelo de componentes de Java EE 6.


  1. @Inject es más general que EJB y es parte de la especificación CDI. Entonces, si desea utilizar @Inject, necesita una implementación de este en su servidor.

  2. Para POJO (no EJB), debe usar @Inject.


Desde Adam Biens Weblog:

Puede usar ambas anotaciones para inyectar EJB. Comience con @Inject y si encuentra algún problema, cambie a @EJB.

@Inject does not have any methods / attributes--it is just a plain annotation: @Target(value = {ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) @Retention(value = RetentionPolicy.RUNTIME) @Documented public @interface Inject { }

Por otro lado, la anotación @EJB le permite pasar información adicional, que podría ser útil para hacer referencia a EJB remotos, o EJB que no pueden ser simplemente inyectados en el estilo "Convención sobre configuración":

@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @Retention(value = RetentionPolicy.RUNTIME) public @interface EJB { public String name() default ""; public String beanName() default ""; public Class beanInterface() default Object.class; public String mappedName() default ""; }