Debería usar @EJB o @Inject

He encontrado esta pregunta: ¿Cuál es la diferencia entre @Inject y @EJB pero no me hice más sabio? No he hecho Java EE anteriormente ni tengo experiencia con la dependency injection, así que no entiendo qué debo usar.

¿Es @EJB y la antigua forma de inyectar? ¿La inyección la realiza el contenedor EJB al usar esta anotación mientras usa @Inject, usa el nuevo marco CDI? ¿Esa es la diferencia y debería usar @Inject en lugar de @EJB si este es el caso?

El @EJB se utiliza para inyectar solo EJB y está disponible desde hace bastante tiempo. @Inject puede inyectar cualquier bean administrado y es parte de la nueva especificación CDI (desde Java EE 6).

En casos simples, simplemente puede cambiar @EJB a @Inject . En casos más avanzados (por ejemplo, cuando dependes en gran medida de los atributos de beanName como beanName , lookup o beanInterface ), para usar @Inject necesitarás definir un campo o método @Producer .

Estos recursos pueden ser útiles para entender las diferencias entre @EJB y @Produces y cómo obtener lo mejor de ellos:

Blog de Antonio Goncalves:
CDI Parte I
CDI Parte II
CDI Parte III

Documentación de JBoss Weld:
CDI y el ecosistema Java EE

Desbordamiento de stack:
Inyectar @EJB Bean basado en condiciones

@Inject puede inyectar cualquier bean, mientras que @EJB solo puede inyectar EJB. Puede usar cualquiera para inyectar EJB, pero prefiero @Inject todas partes.

Actualización: esta respuesta puede ser incorrecta o desactualizada. Por favor, vea los comentarios para más detalles.

@Inject de @Inject a @EJB porque @EJB permite la inyección circular mientras que @Inject en él.

Detalles: necesitaba @PostConstruct para llamar a un método @Asynchronous pero lo haría de forma síncrona. La única forma de realizar la llamada asincrónica era hacer que la llamada original fuera un método de otro bean y hacer que devuelva la llamada al método del bean original. Para hacer esto, cada judía necesitaba una referencia a la otra, por lo tanto circular. @Inject falló para esta tarea mientras que @EJB funcionó.

Aquí hay una buena discusión sobre el tema. Gavin King recomienda @Inject over @EJB para EJB no remotos.

http://www.seamframework.org/107780.lace

o

https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace

Re: Inyectando con @EJB o @Inject?

  1. Nov 2009, 20:48 America / New_York | Enlace Gavin King

Ese error es muy extraño, ya que las referencias locales de EJB siempre deben ser serializables. ¿Error en glassfish, quizás?

Básicamente, @Inject siempre es mejor, ya que:

 it is more typesafe, it supports @Alternatives, and it is aware of the scope of the injected object. 

Recomiendo el uso de @EJB excepto para declarar referencias a EJB remotos.

y

Re: Inyectando con @EJB o @Inject?

  1. Nov 2009, 17:42 America / New_York | Enlace Gavin King

    ¿Significa @EJB mejor con EJB remotos?

Para un EJB remoto, no podemos declarar metadatos como calificadores, @Alternative, etc., en la clase de bean, ya que el cliente simplemente no tendrá acceso a esos metadatos. Además, se deben especificar algunos metadatos adicionales que no necesitamos para el caso local (nombre JNDI global de lo que sea). Entonces, todas esas cosas tienen que ir a otro lugar: a saber, la statement @Produces.

También puede ser útil comprender la diferencia en el término de Session Bean Identity cuando se usa @EJB y @Inject. De acuerdo con las especificaciones, el siguiente código siempre será true :

 @EJB Cart cart1; @EJB Cart cart2; … if (cart1.equals(cart2)) { // this test must return true ...} 

Usar @Inject en vez de @EJB no es lo mismo.

ver también identidad de beans de sesión sin estado para más información

La inyección ya existía en Java EE 5 con las anotaciones @Resource, @PersistentUnit o @EJB, por ejemplo. Pero estaba limitado a ciertos recursos (fuente de datos, EJB …) y a ciertos componentes (Servlets, EJB, beans de respaldo JSF …). Con CDI puede inyectar casi cualquier cosa en cualquier lugar gracias a la anotación @Inject.