EJB 3. 1 @LocalBean vs sem anotação

entendo a diferença entre a vista local, a vista remota e a não-interface. Eu só não entendo qual é a diferença entre" Sem vista " (sem anotação) e sem interface. E também porque devo anotar a minha interface com {[[0]}? E se eu não anotar a interface em tudo, há alguma diferença?

Author: hichris123, 2012-06-05

4 answers

As regras são (da memória):

  1. O Bean tem uma @LocalBean anotação - > o bean tem uma vista sem interface
  2. O Bean tem uma anotação @Local - > o bean tem uma vista local
  3. O Bean tem uma anotação @Remote o bean tem uma vista remota
  4. O Bean não tem anotações de vistas, mas implementa directamente uma interface que tem uma anotação @Local - > o bean tem uma vista local
  5. O Bean não tem anotações de vistas, mas implementa directamente uma interface que tem uma anotação @Remota - >bean tem uma vista remota
  6. O Bean não tem anotações de visualização, mas implementa directamente uma interface que não tem anotações de visualização - > o bean tem uma vista local
  7. O Bean não tem anotações de visualização, e não implementa interfaces -> o bean tem uma janela sem interface

Então, usar @LocalBean e não usar nenhuma anotação são ambas as formas de obter uma vista sem interface. Se você só quer uma visão sem interface, então a coisa mais simples é não anotar. Desde que não esteja a implementar nenhuma interface.

Parte da razão @LocalBean existe para adicionar uma vista sem interface a um bean que também tem uma vista de interface. Imagino que o cenário mais alto na mente dos autores das especificações era aquele em que se tem um feijão como:

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

Onde você iria querer expor ambos os métodos localmente, mas apenas os de grãos grossos getPreferences() remotamente. Você pode fazer isso declarando uma interface remota apenas com esse método, então apenas batendo @LocalBean na classe bean. Sem ele, você teria que escrever um interface local inútil apenas para expor os dois métodos localmente.

Ou, para ver de outra forma, o @LocalBean existe porque existe uma coisa como uma vista sem interface, e a opção sem-anotação existe como um atalho útil.

 125
Author: Tom Anderson, 2012-06-05 11:32:48
  • Remote EJBs: pode ser acedido a partir de clientes remotos (clientes a correr num JVM diferente, como clientes Swing ou JavaFX que funcionam na máquina do utilizador)
  • EJBs locais: só pode ser acesso a partir de outros "componentes" rodando na mesma JVM, por exemplo, Front-ends Web, outras EJBs
  • área sem interface: igual à Local, mas sem especificar a interface de Negócio
  • nenhuma anotação: um POJO simples, mas não uma EJB

As vistas locais/ sem interface são mais eficientes do que EJBs remotos, uma vez que as referências de objetos podem ser passadas ao redor.

 15
Author: Puce, 2012-06-04 23:12:55

Acho que a confusão que estamos a sentir é um resultado da história/reversa da compitabilidade (por assim dizer). Não consigo distinguir nenhuma diferença (excepto que a especificação. necessita de implementações para criar uma interface se usarmos o local-view)

A área sem interface tem o mesmo comportamento que a área local da EJB 3. 0, por exemplo, ele suporta recursos como chamada de pass-by-reference semântica, transação e propagação de segurança. No entanto, uma a janela sem interface não exigir uma interface separada, isto é, tudo os métodos públicos da classe bean são automaticamente expostos à chamador. Por omissão, qualquer 'session bean' que tenha um implemento vazio cláusula e não define quaisquer outras visualizações de clientes locais ou remotos, expõe uma vista de cliente sem interface.

Oracle Blog antes do lançamento do EJB 3.1

 6
Author: esej, 2012-06-05 10:34:03
Se você está interessado em mais detalhes técnicos, deixe-me dizer o que realmente está acontecendo.... Você não tem acesso ao objeto EJB diretamente, isso significa que você não tem a referência (endereço) do objeto EJB real. Quando procura ou injecta a sua EJB, o contentor fornece um objecto como cliente para essa EJB (podemos chamar proxy ou Wrapper) e você invoca os seus métodos de Negócio sobre esse objecto proxy. (É por isso que você não deve usar nova palavra-chave para criar objeto da EJB Classe) Agora, para cada tipo de anotação, o recipiente gera diferentes tipos de proxies com diferentes métodos e funcionalidades.

@LocalBean (ou sem anotação) O seu objecto proxy tem:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local O seu objecto 'proxy' usa a chamada local e o tipo de com.sun.proxy por isso tem:

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

@Remote Você Wrapar objecto usar chamada remota e tem:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()
 0
Author: Ali Parvini, 2017-07-18 07:47:34