2012-06-04 15 views
59

Capisco la differenza tra vista locale, vista remota e vista senza interfaccia. Semplicemente non capisco quale sia la differenza tra "nessuna vista" (nessuna annotazione) e nessuna interfaccia. E anche perché dovrei annotare la mia interfaccia con @Local? Cosa succede se non annoto l'interfaccia, c'è una differenza?EJB 3.1 @LocalBean vs nessuna annotazione

+0

Che tipo di bean EJB sarebbe diventato se non annotare tutto? O per dirla diversamente, come sarebbe il contenitore a sapere se una classe fosse un POJO o un SessionBean? – esej

+2

@esej Si annota con annotazione Stateless, Stateful o Singleton e quindi si annota con annotazione Local, Remote o LocalBean o non si annota con questo tipo di annotazione. Quindi il contenitore sa se una classe è un SessionBean quando lo annoti con l'annotazione Stateless, Stateful o Singleton. – VaclavDedik

+0

corretto. (In precedenza non ero riuscito a vedere cosa pensavi che sarebbe stata la differenza, ora sono diventato più saggio (perché avevo una strana idea). – esej

risposta

114

Le regole sono (a memoria):

  1. Bean ha un'annotazione @LocalBean -> fagiolo ha una vista senza interfaccia
  2. Bean ha un @Local annotazione -> fagioli ha una vista locale
  3. Bean ha un'annotazione @Remote -> bean ha una vista remota
  4. Bean non ha annotazioni di vista, ma implementa direttamente un'interfaccia che ha un'annotazione @Local -> bean ha una vista locale
  5. Bean non ha annotazioni di vista, ma implementa direttamente un'interfaccia che ha un'annotazione @Remote -> bean ha una visualizzazione remota
  6. Bean ha annotazioni immagine, ma implementa direttamente un'interfaccia che non ha annotazioni immagine -> fagiolo ha una visualizzazione locale
  7. Bean ha annotazioni immagine e applica nessuna interfaccia -> bean ha mancato di interfaccia visualizza

Quindi, utilizzando @LocalBean e senza annotazione su sono tutti e due i modi per ottenere una vista senza interfaccia. Se vuoi solo una vista senza interfaccia, la cosa più semplice è non annotare.Purché non si stia implementando alcuna interfaccia.

Parte del motivo @LocalBean esiste per aggiungere una vista senza interfaccia a un bean che ha anche una vista di interfaccia. Immagino che lo scenario più in alto nella mente spec degli autori è stata quella in cui si dispone di un fagiolo come:

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

Dove si vorrebbe esporre entrambi i metodi a livello locale, ma solo la più grossa grana getPreferences() remoto. Puoi farlo dichiarando un'interfaccia remota con solo quel metodo, quindi semplicemente slappando @LocalBean nella classe bean. Senza di esso, dovresti scrivere un'interfaccia locale inutile solo per esporre entrambi i metodi localmente.

Oppure, per guardarlo in un altro modo, lo @LocalBean esiste perché esiste una cosa come una visualizzazione senza interfaccia e l'opzione senza annotazione esiste come una comoda scorciatoia.

+8

Le regole esatte si trovano nella sezione 4.9.7 della specifica EJB 3.1. Sono leggermente più complicati di quelli che presenti (case, webservices, esclusioni dell'interfaccia java.io/javax.ejb), ma questo è un bel riassunto. –

+0

@bkail: Grazie per il riferimento. Non ho una copia delle specifiche a portata di mano, e il sito di Oracle si è fermato quando ho provato a scaricarne uno, quindi non ho potuto controllare. Mi sono reso conto che questa è un'area su cui ho bisogno di leggere, comunque! –

+0

Come ho capito. POJO è un LocalBean? – bitli

14
  • EJB remoti: si può accedere da client remoti (client in esecuzione su una JVM diversa, come i clienti swing o JavaFX che corrono sulla macchina utente)
  • EJB locali: non può che essere l'accesso da altri "componenti" in esecuzione sulla stessa JVM, ad es Web front-end, altri EJB vista
  • No-interfaccia: come locale, ma senza specificare l'interfaccia di business
  • No annotazione: un semplice POJO ma non un EJB

viste/No-interfaccia locale sono più efficiente degli EJB remoti, poiché i riferimenti agli oggetti possono essere passati in giro.

+2

Ho pensato che un POJO diventa EJB quando lo annoti con un'annotazione Stateless, Statefull o Singleton. Mi sto perdendo qualcosa? – VaclavDedik

6

Penso che la confusione che noi/noi sentiamo sia il risultato della storia/retrocompatibilità (per così dire). Non posso dicern alcuna differenza (tranne che la spec. Richiede implementazioni per creare un'interfaccia se usiamo locale-view)

La vista non-interfaccia ha lo stesso comportamento come la visualizzazione locale EJB 3.0, per Ad esempio, supporta funzionalità come la semantica passata di riferimento e la propagazione di transazioni e sicurezza. Tuttavia, una vista senza interfaccia non richiede un'interfaccia separata, ovvero, tutti i metodi pubblici della classe bean vengono automaticamente esposti al chiamante . Per impostazione predefinita, qualsiasi bean di sessione che abbia una clausola vuota e non definisca altre visualizzazioni client locali o remote, espone una vista client senza interfaccia.

Oracle Blog before release of EJB 3.1

0

Se sei interessato a maggiori dettagli tecnici, lasciami dire che cosa sta succedendo ... Non hai accesso direttamente all'oggetto EJB, significa che non hai il riferimento (indirizzo) di l'oggetto EJB attuale. Quando si cerca o si inietta il bean, il contenitore fornisce un oggetto come client per tale EJB (possiamo chiamare proxy o Wrapper) e si invocano i metodi commerciali su quell'oggetto proxy. (Ecco perché non dovresti usare una nuova parola chiave per creare oggetto della classe EJB)

Ora, per ogni tipo di annotazione, il contenitore genera diversi tipi di proxy con metodi e funzionalità differenti.

@LocalBean (o nessuna annotazione) vostro oggetto proxy ha:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local È oggetto proxy utilizzare chiamata locale e il tipo di com.sun.proxy Così ha:

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

@Remote È Wrapper oggetto utilizzare chiamata remota ed ha:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()