Enterprise JavaBeans
Portaal Javaplatform |
De Enterprise JavaBeans-specificatie is één van de Java-APIs in de J2EE-standaard. EJB's zijn bedoeld om in een meerlagenmodel de zogenaamde businesslogica te bevatten.
EJBs bieden de volgende mogelijkheden:
- communicatie met andere componenten via CORBA
- persistentie
- transacties
- parallelle uitvoering
- gebruikmaken van Java Messaging Service
- gebruik van naming en directory services (JNDI)
- beveiliging
- in gebruik nemen van componenten in een EJB-container in een J2EE-applicatieserver
Verder definieert de EJB-specificatie de rollen die de EJB-container en de EJB's spelen. Ook wordt beschreven hoe EJB's in gebruik worden genomen in de container. De plaats van EJB in de gelaagde J2EE-architectuur is als volgt:
Inhoud |
[bewerk] Typen EJB's
EJB's zijn te onderscheiden in 3 types:
- session beans (stateless of stateful)
- entity beans
- message driven beans
[bewerk] stateless session bean
Een stateless session bean is een gedistribueerd object dat geen status bijhoudt en dus door meerdere clients gebruikt kan worden.
[bewerk] stateful session bean
Een stateful session bean is een gedistribueerd object dat status bijhoudt tussen aanroepen. De EJB-container associeert een instantie van stateful session bean met één bepaalde cliënt. Voor elke cliënt die gebruik maakt van de J2EE-applicatie wordt dus een stateful session bean geïnstantieerd op het moment dat deze nodig is.
[bewerk] entity bean
Een entity bean is een object met een persistente status. Deze status kan door de bean zelf (Bean Managed Persistency of BMP) of door de container (Container Managed Persistency) worden vastgelegd. De Bean Managed Persistent Entity Bean is minder gebruikelijk.
[bewerk] message driven beans
Een message driven bean is een object dat boodschappen ('messages') van een boodschappenrij ('message queue') verwerkt.
[bewerk] EJB-techniek
EJB's worden gebruikt in een EJB container in een applicatie server. De EJB specificatie beschrijft hoe een EJB samenwerkt met een container en hoe een cliënt met de combinatie van de EJB container en de EJB samenwerkt.
Elke EJB bestaat uit een Java-implementatie class en twee interfaces. De EJB-container instantieert objecten van de de implementatie class om de EJB-implementatie te leveren. De twee interfaces worden gebruikt door de cliënt die de EJB aanroept. Dit kan een 'echte' cliënt zijn, maar ook een andere EJB. De twee interfaces, de home en de remote interface, specificeren de methodes van de EJB die aanroepbaar zijn door de cliënt.
Deze methodes worden verdeeld in twee groepen:
- methodes die niet gekoppeld zijn aan een specifieke instantie van de EJB, bijvoorbeeld de methodes om een EJB te creëren of om een bestaande EJB te vinden. Deze worden gedefinieerd in de home interface.
- methodes voor een specifieke instantie van een EJB. Deze worden in de remote interface geplaatst.
Omdat deze twee interfaces alleen maar interfaces zijn en dus zelf geen implementatie bevatten moet de EJB-container-implementatie classes genereren die als proxy in de cliënt kunnen worden gebruikt. De cliëntcode roept een methode op de proxy aan die vervolgens de argumenten naar de EJB server stuurt. Deze proxies gebruiken Java RMI om met de EJB-server te communiceren.
De server roept vervolgens een methode op een instantie van een EJB in de container. Deze methode correspondeert met de methode die op de proxy werd aangeroepen.
[bewerk] Home Interface
Zoals hierboven opgemerkt bevat de home interface de methoden die de cliënts in staat stellen om bepaalde class-methoden aan te roepen, dat wil zeggen methoden die niet geassocieerd zijn met een bepaalde instantie van een class. De EJB-standaard beperkte de functionaliteit van deze methodes tot het creëren van een EJB of het vinden van een EJB als deze een entity bean is. Sinds de EJB 2.0 specificatie is er meer functionaliteit toegestaan dan creatie, verwijderen en vinden.
[bewerk] Remote Interface
De remote interface definieert de methodes die op een instantie van een EJB kunnen worden aangeroepen. Over het algemeen zullen dit de methodes zijn die de echte functionaliteit van een EJB implementeren.
[bewerk] EJB-implementatieklasse
De implementatieklasse wordt door de programmeur geschreven. Deze klasse implementeert de businesslogica (of bevat data ten behoeve van businesslogica in andere classes). Deze klasse implementeert altijd de methodes van de remote interface en mogelijk methodes van de home interface.
[bewerk] Overeenkomsten tussen interfacemethodes en implementatiemethodes
De aanroep van een methode van de home interface wordt door de EJB-container doorgestuurd naar een corresponderende methode op de implementatieklasse, voorafgegaan door een 'ejb' voorvoegsel. De eerste letter van de home interface methode wordt hierbij in een hoofdletter vertaald (dit is in overeenstemming met de richtlijnen voor namen van methods zoals die door Sun worden beschreven). Uiteraard moet de implementatie methode exact dezelfde argumenten accepteren als de methode van de home interface.
Aanroepen van methodes op de remote interface worden door de EJB-container doorgegeven aan de corresponderende implementatie method, waarbij de naam en argumenten precies hetzelfde zijn.
[bewerk] Communicatie met andere componenten
De EJB-specificatie eist dat EJB-containers toegang tot EJB's mogelijk maken via RMI-IIOP. Dit maakt EJB's toegankelijk vanuit elke CORBA-applicatie.
[bewerk] Persistentie
EJB-containers moeten zowel CMP als BMP ondersteunen.
[bewerk] Transacties
EJB-containers moeten container en bean managed transactions ondersteunen. Container managed transactions worden beschreven in een declaratieve syntax in de deployment descriptor.
[bewerk] Boodschappen
JMS wordt gebruikt om asynchroon boodschappen uit te wisselen tussen componenten. Dit maakt het ook mogelijk om een J2EE-applicatie via een message queue (bijvoorbeeld IBM MQSeries of Oracle Advanced Queueing) te communiceren met andere applicaties.
[bewerk] Beveiliging
De EJB-container moet er voor zorgen dat EJBs alleen kunnen worden aangeroepen door cliënts die hiervoor geautoriseerd zijn.
[bewerk] EJB's in gebruik nemen (deployment)
De EJB-specificatie beschrijft ook het mechanisme dat het mogelijk maakt om EJB's in gebruik te nemen op een standaard manier, ongeacht welke J2EE-applicatieserver er gebruikt wordt. Informatie over hoe de EJB moet worden gebruikt zoals de namen van de remote en de home interfaces, of en hoe de bean in een database moet worden opgeslagen wordt beschreven in de deployment descriptor.
Dit XML-document heeft een voorgeschreven opbouw met een beschrijving voor elke EJB die in gebruik genomen moet worden. Deze beschrijving bevat de volgende informatie voor elke EJB:
- Naam van de home interface
- Java class van de EJB
- Java interface voor de home interface
- Java interface voor het object
- Een beschrijving van eventuele persistente opslag
- Een beschrijving van rollen en permissies voor toegangscontrole.
Er moet wel worden opgemerkt dat veel EJB-containers extra beschrijvingen gebruiken om EJB's in gebruik te nemen. Deze informatie moet dan worden vastgelegd in een extra file of in een ander formaat. De meeste leveranciers van EJB-containers leveren ook gereedschappen die deze extra informatie gebruiken en mogelijk ook de home en remote interfaces genereren aan de hand van deze extra informatie.