Un bean è una classe Java con nomi di metodi che seguono le linee guida Java Bean (chiamate anche modelli di progettazione) per proprietà , metodi ed eventi. Pertanto, qualsiasi metodo pubblico della classe bean che non fa parte della definizione di una proprietà è un metodo bean. Al minimo, una classe Java anche con una proprietà come unico membro (ovviamente, accompagnando il getter pubblico e il setter richiesti), un metodo pubblico come unico membro o solo un metodo di registrazione del listener di eventi pubblici è un bean Java. Inoltre, la proprietà può essere di sola lettura (ha un metodo getter ma nessun setter) o di sola scrittura (ha solo un metodo setter). Il bean Java deve essere una classe pubblica per essere visibile a qualsiasi strumento o contenitore beanbox. Il contenitore deve essere in grado di istanziarlo; quindi, deve avere anche un costruttore pubblico. La specifica JavaBeansnon richiede che un bean abbia un costruttore zero-args pubblico, esplicito o predefinito, per un contenitore per istanziarlo. Se è possibile fornire un file (con estensione .ser) contenente un'istanza serializzata, uno strumento beanbox può utilizzare quel file per creare un'istanza di un bean prototipo. Altrimenti, il bean deve avere un costruttore pubblico zero-args, esplicito o predefinito.
Una volta creata un'istanza del bean, l'API Java Bean (java.beans. *) Può introspettarlo e chiamarci metodi. Se non è disponibile alcuna classe che implementa l'interfaccia BeanInfo o l'estensione di un'implementazione di BeanInfo, la classe SimpleBeanInfo, l'introspezione comporta l'uso della riflessione (introspezione implicita) per studiare i metodi supportati da un bean di destinazione e quindi applicare modelli di progettazione semplici (linee guida) da cui dedurre quei metodi quali proprietà, eventi e metodi pubblici sono supportati. Se è disponibile una classe che implementa l'interfaccia BeanInfo (per un bean Foo, deve essere denominata FooBeanInfo), l'API ignora l'introspezione implicita e utilizza metodi pubblici (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) di questa classe per ottenere il informazione. Se è disponibile una classe che estende SimpleBeanInfo, a seconda di quale dei metodi pubblici SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) vengono sovrascritti, utilizzerà tali metodi per ottenere informazioni; per un metodo che non viene sostituito, verrà impostato automaticamente l'introspezione implicita corrispondente. Un bean deve comunque essere istanziato anche se non viene effettuata alcuna introspezione implicita. Pertanto, il requisito di un costruttore pubblico di zeri-args. Ma, naturalmente, l'interfaccia Serializable o Externalizable non è necessaria per essere riconosciuta. Tuttavia, la specifica Java Bean dice: "Vorremmo anche che fosse" banale "per il caso comune di un piccolo Bean che vuole semplicemente salvare il suo stato interno e non vuole pensarci". Pertanto, tutti i bean devono implementare l'interfaccia Serializable o Externalizable. Complessivamente, La specifica JavaBeans non è difficile e veloce su ciò che costituisce un bean. "Scrivere componenti JavaBeans è sorprendentemente facile. Non è necessario uno strumento speciale e non è necessario implementare alcuna interfaccia. Scrivere bean è semplicemente una questione di seguire determinate convenzioni di codifica. Tutto quello che devi fare è rendere la tua classe simile a un bean: gli strumenti che utilizzano i bean saranno in grado di riconoscere e utilizzare il bean. " In verità, anche la seguente classe è un Java Bean,
public class Trivial implements java.io.Serializable {}
Supponiamo che un costruttore di bean abbia alcuni parametri. Supponiamo che alcuni siano tipi semplici. Il contenitore potrebbe non sapere quali valori assegnare loro; anche se lo fa, l'istanza risultante potrebbe non essere riutilizzabile. Può avere senso solo se l'utente può configurare (specificare i valori), ad esempio annotazioni o file di configurazione XML come nei bean Spring. Supponiamo che alcuni parametri siano tipi di classe o interfaccia. Ancora una volta, il contenitore potrebbe non sapere quali valori assegnare ad esso. Può avere senso solo se l'utente può configurare (specificare oggetti specifici) dicendo annotazioni o file di configurazione XML. Tuttavia, anche in primavera (tramite file di configurazione xml), l'assegnazione di oggetti specifici (con nomi di stringa) agli argomenti del costruttore (attributo o elemento degli argomenti del costruttore) non è un errore di battitura, è sostanzialmente come l'iniezione di risorse. Fare riferimenti ad altri bean Spring (chiamati collaboratori; tramite elemento in un elemento argomento del costruttore) è fondamentalmente l'iniezione di dipendenza e quindi la tipesa. Ovviamente, una dipendenza (bean collaboratore) potrebbe avere un costruttore con parametri iniettati; quelle dipendenze iniettate potrebbero avere un costruttore con parametri e così via. In questo scenario, in definitiva, occorrerebbero alcune classi di bean (ad esempio MyBean.class) che il contenitore può creare un'istanza semplicemente chiamando il nuovo MyBean () prima che possa costruire gli altri bean collaboranti tramite l'iniezione di dipendenza sui costruttori, quindi il requisito per i bean per avere un costruttore pubblico zero-args. Supponiamo che, se un contenitore non supporta l'iniezione di dipendenza e / o non consente l'assegnazione di valori di tipo semplice al costruttore tramite alcune annotazioni o file di configurazione XML come in Spring, i costruttori di bean non dovrebbero avere parametri. Anche un'applicazione Spring bean avrebbe bisogno di alcuni bean per avere un costruttore pubblico a zero-args (ad esempio, in uno scenario in cui l'applicazione Spring non ha bean con solo semplici tipi come argomenti del costruttore).
I bean gestiti JSF vengono eseguiti in un contenitore Web. Possono essere configurati con l'annotazione @ManagedBean o con un file di risorse della configurazione dell'applicazione gestito-bean.xml. Tuttavia, supporta solo l'iniezione tramite iniezione di risorse (non typesafe); non adatto per l'iniezione su costruttori. Le specifiche JSFrichiede che i bean gestiti debbano disporre di costruttori pubblici a argomento zero. Inoltre dice: “A partire dalla versione 2.3 di questa specifica, l'uso della funzione bean gestita come specificato in questa sezione è fortemente sconsigliato. Una soluzione migliore e integrata in modo più coerente per risolvere lo stesso problema consiste nell'utilizzare Contexts and Dependency Injection (CDI), come specificato in JSR-365. "In altre parole, utilizzare i bean gestiti CDI, che offre un'iniezione di dipendenza tipica su costruttori affini ai bean Spring. La specifica CDI adotta la specifica Managed Beans, che si applica a tutti i contenitori della piattaforma JEE, non solo al livello Web. Pertanto, il contenitore Web deve implementare la specifica CDI.
Ecco un estratto dalla specifica Managed Bean
"I fagioli gestiti sono oggetti gestiti dal contenitore con requisiti minimi, altrimenti noti con l'acronimo" POJOs "(Plain Old Java Objects) ... possono essere visti come una versione potenziata della piattaforma Java EE del modello di componente JavaBeans trovato sulla piattaforma Java SE .... Il lettore non mancherà che Managed Beans ha un precursore nell'omonima struttura trovata nella tecnologia JSF (JavaServer Faces) ... I fagioli gestiti come definiti in questa specifica rappresentano una generalizzazione di quelli trovati in JSF; in particolare, Managed Beans può essere utilizzato ovunque in un'applicazione Java EE, non solo nei moduli web. Ad esempio, nel modello di componente di base, Managed Beans deve fornire un costruttore senza argomenti, ma una specifica che si basa su Managed Beans, come CDI (JSR-299), può rilassare tale requisito e consentire a Managed Beans di fornire ai costruttori firme più complesse, purché seguano alcune regole ben definite ... Un Managed Bean non deve essere: una classe finale, una classe astratta, una classe interna non statica . Un bean gestito potrebbe non essere serializzabile a differenza di un normale componente JavaBean. " Pertanto, la specifica di Managed Beans, altrimenti nota come POJOs o POJO bean, consente l'estensione come nel CDI.
La specifica CDI ridefinisce i bean gestiti come: Durante l'esecuzione in Java EE, una classe Java di livello superiore è un bean gestito se soddisfa i requisiti:
• Non è una classe interiore. • È una classe non astratta o è annotata @Decorator. • Non implementa javax.enterprise.inject.spi.Extension. • Non è annotato @Vetoed o in un pacchetto annotato @Vetoed. • Ha anche un costruttore appropriato: la classe ha un costruttore senza parametri, oppure la classe dichiara un costruttore annotato @Inject.
Tutte le classi Java che soddisfano queste condizioni sono bean gestiti e pertanto non è richiesta alcuna dichiarazione speciale per definire un bean gestito. O
se è definito come un bean gestito da qualsiasi altra specifica Java EE e se
• Non è annotato con un'annotazione che definisce i componenti EJB né dichiarato come classe bean EJB in ejb-jar.xml.
A differenza dei bean Spring, non supporta i costruttori con tipi semplici, il che potrebbe essere possibile se supportasse la configurazione con file di configurazione XML come in Spring o eventuali annotazioni.
Gli EJB vengono eseguiti in un contenitore EJB. Le sue specifichedice: "Un componente bean di sessione è un bean gestito." "La classe deve avere un costruttore pubblico che non accetta argomenti", afferma sia per il bean di sessione che per il bean basato sui messaggi. Inoltre, dice: "La classe del bean di sessione è non è richiesto per implementare l'interfaccia SessionBean o l'interfaccia Serializable. " Per lo stesso motivo dei bean JSF, che l'iniezione di dipendenza EJB3 è fondamentalmente l'iniezione di risorse, i bean JSF non supportano i costruttori con argomenti, ovvero tramite l'iniezione di dipendenza. Tuttavia, se il contenitore EJB implementa CDI, "Opzionalmente: la classe può avere un costruttore aggiuntivo annotato con l'annotazione Inject, "indica sia il bean di sessione che il bean basato sui messaggi perché," un bean impacchettato in un archivio bean CDI e non annotato con javax.enterprise.inject.Vetoed annotation, è considerato abilitato per CDI fagiolo."