2010-01-18 10 views
9

Hay dos maneras que conozco para obtener una instancia EJB: inyección de dependenciasEJB3 - obtención de frijol mediante inyección frente a búsqueda: ¿cuáles son las diferencias, implicaciones, errores?

  • en servlets y EJB a través de la anotación @EJB
  • JNDI de búsqueda a través de cualquier parte Context.lookup

Lo que se las diferencias, implicaciones y errores en el uso de cualquiera de estos enfoques? ¿Son lo mismo? ¿La inyección de dependencia es más rápida que la búsqueda? ¿Qué pasa con el manejo de transacciones y la gestión del ciclo de vida de los objetos?

cosas yo sepa incluyen:

anotación

  • obras con servlets y EJB y solamente
  • sintaxis conveniente
  • contenedor independiente

de búsqueda

  • puede crear una instancia de diferentes implementaciones de la interfaz EJB programáticamente en tiempo de ejecución.
  • funciona desde cualquier lugar, p. POJOs.
  • depende de la convención de nombres de contenedor

Respuesta

2

de búsqueda depende de la presencia de la implementación JNDI, es decir, tiene que configurar la aplicación JNDI con el fin de ejecutar las pruebas unitarias, campos anotados a continuación se pueden configurar de forma manual.

6

Ambos logran el mismo resultado. Es más una cuestión de acoplamiento. Con la anotación, logra un acoplamiento flexible y es más fácil burlarse y probar. Con la búsqueda directa, depende del contexto inicial que puede ser poco conveniente a veces.

IMHO búsqueda no funciona en todas partes. Por ejemplo, en Glassfish, una búsqueda en un EJB local desde un POJO funcionará solo si se ha "importado" previamente con @EJBs(...) en uno de los beans de sesión que usa el POJO. Ver this discussion. Debe comprender la diferencia entre local y global JNDI para eso.

Mi consejo sería: utilizar la anotación tanto como sea posible. Si un POJO necesita una referencia a un EJB, páselo como parámetro (por ejemplo, en el constructor). Eso se llama inversión de dependencia y, de todos modos, es una buena práctica.

0

Creo que es difícil burlarse de los EJB anotados. Al utilizar la búsqueda, puede construir algunos cambios de acuerdo con su entorno (test -> LoginMockBean, production -> LoginBean).

+2

Eso es simplemente incorrecto. Si es inyectado por el contenedor, significa que puede inyectarlo usted mismo más fácilmente en las pruebas, por ejemplo 'MyBean bean = new MyBean(); bean.injectedBean = new Mock() '. Enganchar en la búsqueda es más complicado, especialmente si el código depende de 'new InitialContext()'. ¿Cómo se devuelve una versión especial del contexto para sus pruebas? – ewernli

Cuestiones relacionadas