He encontrado esta pregunta: ¿Cuál es la diferencia entre @Inject y @EJB pero no entendí nada mejor? No he hecho Java EE antes ni tengo experiencia con la inyección de dependencia, así que no entiendo qué debo usar.
¿Es @EJB una antigua forma de inyectar? ¿La inyección la realiza el contenedor EJB cuando usa esta anotación mientras usa @Inject usa el nuevo marco CDI? ¿Es esa la diferencia y debería usar @Inject en lugar de @EJB si este es el caso?
fuente
@EJB
funciona para inyección circular (un bean singleton y otro bean que necesitan una referencia entre ellos)? (con referencia a mi respuesta a continuación, no estoy seguro de si estoy haciendo lo correcto al cambiar a@EJB
)@Inject
puede inyectar cualquier bean, mientras@EJB
que solo puede inyectar EJB. Puede usar cualquiera para inyectar EJB, pero prefiero en@Inject
todas partes.fuente
Actualización: esta respuesta puede ser incorrecta o desactualizada. Por favor, vea los comentarios para más detalles.
Cambié de
@Inject
a@EJB
porque@EJB
permite la inyección circular mientras@Inject
vomita.Detalles: necesitaba
@PostConstruct
llamar a un@Asynchronous
método, pero lo haría sincrónicamente. La única forma de hacer la llamada asincrónica era hacer que la llamada original fuera un método de otro bean y que volviera a llamar al método del bean original. Para hacer esto, cada bean necesitaba una referencia al otro, por lo tanto circular.@Inject
falló para esta tarea mientras@EJB
trabajaba.fuente
@Inject
colóquelas en los campos públicos del otro. Si eso funciona, entonces mi respuesta es incorrecta. Si eso no funciona, entonces mi respuesta es correcta hasta ahora. A continuación, cambie el@Inject
a@EJB
(y posiblemente anotar las clases ellos mismos? Lo olvido). Entonces la inyección mutua cíclica debería funcionar bien. Es por eso que cambié de@Inject
a@EJB
. Espero que esto tenga sentido.Aquí hay una buena discusión sobre el tema. Gavin King recomienda @Inject sobre @EJB para EJB no remotos.
http://www.seamframework.org/107780.lace
o
https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace
y
fuente
También puede ser útil comprender la diferencia en términos de Identidad de bean de sesión cuando se usa @EJB y @Inject. Según las especificaciones, el siguiente código siempre será
true
:Usar @Inject en lugar de @EJB no es lo mismo.
vea también identidad de beans de sesión sin estado para más información
fuente
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, EJBs, JSF backing bean...). Con CDI puede inyectar casi cualquier cosa en cualquier lugar gracias a la anotación @Inject.
fuente