beans - javax inject example
DeberÃa usar @EJB o @Inject (6)
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 inyección de dependencia, 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?
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?
- 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?
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 declaración @Produces.
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.
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
@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ó.
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 pila:
Inyectar @EJB Bean basado en condiciones