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
risposta
Le regole sono (a memoria):
- Bean ha un'annotazione
@LocalBean
-> fagiolo ha una vista senza interfaccia - Bean ha un
@Local
annotazione -> fagioli ha una vista locale - Bean ha un'annotazione
@Remote
-> bean ha una vista remota - Bean non ha annotazioni di vista, ma implementa direttamente un'interfaccia che ha un'annotazione @Local -> bean ha una vista locale
- Bean non ha annotazioni di vista, ma implementa direttamente un'interfaccia che ha un'annotazione @Remote -> bean ha una visualizzazione remota
- Bean ha annotazioni immagine, ma implementa direttamente un'interfaccia che non ha annotazioni immagine -> fagiolo ha una visualizzazione locale
- 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.
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. –
@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! –
Come ho capito. POJO è un LocalBean? – bitli
- 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.
Ho pensato che un POJO diventa EJB quando lo annoti con un'annotazione Stateless, Statefull o Singleton. Mi sto perdendo qualcosa? – VaclavDedik
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.
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()
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
@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
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