# Enterprise JavaBeans

De Enterprise JavaBeans-specificatie is een van de Java-API's in de J2EE-standaard. EJB's zijn bedoeld om in een meerlagenmodel de zogenaamde businesslogica van een applicatie 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:
    cliënt-laag: webbrowser/HTML-pagina's
    web-laag: Servlets/JSP's
    businesslogica: EJB

## Typen EJB's

Er zijn drie typen beans:
* Stateless Session beans
* Stateful Session beans
* Message-driven beans
Eerdere versies van Enterprise JavaBeans bevatten ook een entity bean. Dit waren objecten met een persistente status. Deze status kon door de bean zelf (Bean Managed Persistency of BMP) of door de container (Container Managed Persistency) worden vastgelegd. De Bean Managed Persistent Entity Bean was minder gebruikelijk. Vanaf Enterprise JavaBeans 3.0 heeft men de entity beans vervangen door de Java Persistence API.

### Stateless session bean

Een stateless session bean is een gedistribueerd object dat geen status bijhoudt en dus door meerdere clients gebruikt kan worden.

### Stateful session bean

Een stateful session bean is een gedistribueerd object dat de status van de client bijhoudt tussen aanroepen. De EJB-container associeert een instantie van stateful session bean met één bepaalde cliënt. Voor elke cliënt die gebruikmaakt van de J2EE-applicatie wordt dus een stateful session bean geïnstantieerd op het moment dat deze nodig is.

### Message-driven beans

Een message driven bean is een object dat boodschappen ('messages') van een boodschappenrij ('message queue') verwerkt.

## EJB-techniek

EJB's worden gebruikt in een EJB-container in een applicatieserver. 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 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 client.
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 client kunnen worden gebruikt. De cliëntcode roept een methode op de proxy aan die vervolgens de argumenten naar de EJB server stuurt. Deze proxy's gebruiken Java RMI om met de EJB-server te communiceren.
De server roept vervolgens een methode aan op een instantie van een EJB in de container. Deze methode komt overeen met de methode die op de proxy werd aangeroepen.

### Home Interface

Zoals hierboven opgemerkt bevat de home-interface de methoden die de clients 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 creëren, verwijderen en vinden.

### 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.

### 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.

#### 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 implementatiemethode 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-methode, waarbij de naam en argumenten precies hetzelfde zijn.

### 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.

### Persistentie

EJB-containers moeten zowel CMP (Container Managed Persistency) als BMP (Bean Managed Persistency) ondersteunen.

### Transacties

EJB-containers moeten container en bean managed transactions ondersteunen. Container managed transactions worden beschreven in een declaratieve syntaxis in de deployment descriptor.

### Boodschappen

Java Message Services (JMS) worden 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.

### Beveiliging

De EJB-container moet ervoor zorgen dat EJB's alleen kunnen worden aangeroepen door clients die hiervoor geautoriseerd zijn.

## 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.
* Javaklasse 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.