2012-06-04 29 views
59

Entiendo la diferencia entre la vista local, la vista remota y la vista sin interfaz. Simplemente no entiendo cuál es la diferencia entre "sin vista" (sin anotación) y vista sin interfaz. Y también ¿por qué debería anotar mi interfaz con @Local? ¿Qué ocurre si no anoto la interfaz en absoluto? ¿Hay alguna diferencia?EJB 3.1 @LocalBean sin anotación

+0

¿Qué clase de bean EJB tendría que ser si usted no anotar todo? O para decirlo de otra manera, ¿cómo sabría el contenedor si una clase fuera un POJO o un SessionBean? – esej

+2

@esej Anotarlo con la anotación Stateless, Stateful o Singleton y luego anotarlo con la anotación Local, Remota o LocalBean o no anotarlo con este tipo de anotación. Entonces, el contenedor sabe si una clase es SessionBean cuando la anota con anotación Stateless, Stateful o Singleton. – VaclavDedik

+0

Correcto. (Antes no veía lo que pensabas que sería la diferencia, ahora me he vuelto más inteligente (porque tenía una idea extraña).) – esej

Respuesta

114

Las reglas son (de memoria):

  1. Bean tiene una anotación de @LocalBean -> bean tiene una vista sin interfaz
  2. Bean tiene un @Local anotación - bean> tiene una vista local
  3. Bean tiene una anotación @Remote -> bean tiene una vista remota
  4. Bean no tiene anotaciones de vista, pero implementa directamente una interfaz que tiene una anotación @Local -> bean tiene una vista local
  5. Bean no tiene anotaciones de vista, pero implementa directamente una interfaz que tiene una anotación @Remote -> bean tiene una vista remota
  6. haba no tiene anotaciones de vista, pero implementa directamente una interfaz que no tiene anotaciones de vista -> bean tiene una vista local
  7. haba no tiene anotaciones de vista, e implementa ninguna interfaz -> bean tiene una interfaz sin ver

Entonces, usando @LocalBean y sin anotación en todas son formas de obtener una vista sin interfaz. Si solo desea una vista sin interfaz, lo más simple es no hacer anotaciones.Siempre que no esté implementando ninguna interfaz.

Parte de la razón @LocalBean existe para agregar una vista sin interfaz a un bean que también tiene una vista de interfaz. Me imagino que el escenario presente en la mente de los autores de especificaciones fue una de las que tiene un grano como:

@Stateless 
public class UserPreferences { 
    public String getPreference(String preferenceName); 
    public Map<String, String> getPreferences(); 
} 

en el que quiera exponer ambos métodos a nivel local, pero sólo el de grano más grueso getPreferences() forma remota. Puedes hacer eso declarando una interfaz remota con solo ese método, y luego simplemente presionando @LocalBean en la clase de bean. Sin él, tendrías que escribir una interfaz local sin sentido solo para exponer ambos métodos localmente.

O, para verlo de otra manera, el @LocalBean existe porque existe una vista sin interfaz, y la opción sin anotaciones existe como un acceso directo útil.

+8

Las reglas exactas se encuentran en la sección 4.9.7 de la especificación EJB 3.1. Son un poco más complicados de lo que presenta (domicilios, servicios web, exclusiones de la interfaz java.io/javax.ejb), pero este es un buen resumen. –

+0

@bkail: Gracias por la referencia. No tengo una copia de la especificación a mano, y el sitio de Oracle se detuvo cuando intenté descargar uno, así que no pude verificarlo. Sin embargo, ¡me he dado cuenta de que es un área en la que necesito leer! –

+0

Según tengo entendido. ¿Es POJO un LocalBean? – bitli

14
  • EJB remotos: se puede acceder desde clientes remotos (clientes que se ejecutan en una JVM diferente, como el swing o JavaFX clientes que se ejecutan en la máquina del usuario)
  • EJB locales: sólo se puede acceder desde otros "componentes" ejecutándose en la misma JVM, por ejemplo Web front-end, otra EJB vista
  • sin interfaz: igual que el local pero sin especificando la interfaz de negocio
  • Sin anotación: un POJO simple, pero no un EJB

vistas/sin interfaz local son más eficiente que los EJB remotos, ya que las referencias de objetos se pueden pasar.

+2

Pensé que un POJO se convierte en EJB cuando lo anota con anotación Stateless, Statefull o Singleton. ¿Me estoy perdiendo de algo? – VaclavDedik

6

Creo que la confusión que usted/nosotros siente es el resultado de la historia/retrocompatibilidad (por así decirlo). No puedo dicern ninguna diferencia (excepto que la especificación. Implementaciones requiere para crear una interfaz si utilizamos local de visión)

La vista sin interfaz tiene el mismo comportamiento que la vista local EJB 3.0, para Por ejemplo, admite funciones como la semántica de llamadas de paso por referencia y la propagación de transacciones y seguridad. Sin embargo, una vista sin interfaz no requiere una interfaz separada, es decir, todos los métodos públicos de la clase bean se exponen automáticamente al llamador . De manera predeterminada, cualquier bean de sesión que tenga una cláusula vacía implementa y no defina ninguna otra vista de cliente local o remota, expone una vista de cliente sin interfaz.

Oracle Blog before release of EJB 3.1

0

Si está interesado en más detalles técnicos, déjeme decir que lo que está pasando realmente ... Usted no tiene acceso al objeto EJB directamente, significa que no tiene la referencia (dirección) de el objeto EJB real. Cuando busca o inyecta su EJB, el contenedor proporciona un objeto como el cliente para ese EJB (podemos llamar proxy o Wrapper) e invoca sus métodos comerciales en ese objeto proxy. (Es por eso que no debe usar una nueva palabra clave para crear el objeto de la clase EJB)

Ahora, para cada tipo de anotación, el contenedor genera diferentes tipos de proxies con diferentes métodos y funcionalidades.

@LocalBean (o ninguna anotación) Su objeto proxy tiene:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local Es objeto proxy utiliza llamada local y el tipo de com.sun.proxy Por lo que tiene:

  • getSerializableObjectFactory()
  • isProxyClass()
  • getProxyClass()
  • getInvocationHandler()
  • newProxyInstance()

@Remote objeto Usted Envoltura utilizar la llamada a distancia y que tiene:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()
Cuestiones relacionadas