title: Enterprise JavaBeans
text: # Enterprise JavaBeans
  
  Enterprise JavaBeans (EJB) est une architecture de composants logiciels côté serveur pour la plateforme de développement Java EE.
  
  Cette architecture propose un cadre pour créer des composants distribués (c’est-à-dire déployés sur des serveurs distants) écrit en langage de programmation Java hébergés au sein d'un serveur applicatif permettant de représenter des données (EJB dit entité), de proposer des services avec ou sans conservation d'état entre les appels (EJB dit session), ou encore d'accomplir des tâches de manière asynchrone (EJB dit message). Tous les EJB peuvent évoluer dans un contexte transactionnel.
  
  De la version 1.0 à la version 2.1, un EJB était accompagné d'un ou plusieurs fichiers de déploiement écrits en XML qui permettait au serveur applicatif de déployer correctement l'objet au sein d'un conteneur. C'était notamment dans ces fichiers de déploiement que le développeur avait la possibilité de préciser le cadre transactionnel dans lequel l'objet allait s'exécuter. Depuis la version 3.0, le modèle EJB utilise le principe d'annotation Java (meta-données) pour spécifier toute la configuration et les propriétés transactionnelles de l'objet. Le fichier de code source de l'EJB se suffit à lui-même.
  
  C'est le serveur applicatif qui est chargé de la création, la destruction, la passivation ou l'activation de ses composants en fonction des besoins. Le client via un appel RMI (ou une de ses dérivées) va rechercher un EJB par son nom logique JNDI et appeler une ou plusieurs méthodes de cet objet.
  
  ## Les EJB session (Session Bean)
  
  Les EJB sessions sont des objets proposant des services à leur appelant. Ils proposent un certain nombre de méthodes écrites par le développeur. Il y a deux types d'EJB session : les EJB sessions ne conservant pas leur état entre deux appels (EJB dit « stateless »), et ceux le conservant (EJB dit « stateful »). Il n'y a aucune garantie qu'entre deux appels au même EJB l'instance de l'objet soit la même.
  
  ### Stateless Session Bean
  
  La particularité principale d'un Stateless Session Bean est de ne pas conserver d'état entre les différents appels.
  
  ### Stateful Session Bean
  
  La particularité principale d'un Stateful Session Bean est de conserver son état entre différents appels de méthodes.
  
  ## Les EJB entité
  
  Les EJB entité sont des beans ayant majoritairement pour vocation d'être persistants, c'est-à-dire pouvant être stockés sur un support physique entre deux sessions. Les EJB entité peuvent être de deux sortes : BMP (Bean Managed Persistence) ou CMP (Container Managed Persistence) (voir Java Persistence API).
  
  Les EJB BMP sont des beans dont la persistance a dû être programmée par le développeur (ce dernier doit respecter un format pour la classe et les méthodes à implémenter sont imposées par la norme).
  
  Les EJB CMP sont eux des beans dont la persistance est directement assurée par le conteneur d'EJB ; le mapping entre l'objet et son support de persistance est indiqué au conteneur via les fichiers descripteurs de déploiement. Le développeur, une fois le fichier de déploiement réalisé, n'a pas besoin d'écrire le code de persistance.
  
  Depuis la version 3.0 de la spécification EJB, la notion de bean BMP/CMP n'existe plus : les EJB entité sont directement liés à la base de données via un mapping objet-relationnel. Ce mapping est défini soit dans un fichier de configuration XML, ou directement dans le code Java en utilisant des annotations.
  
  Cette nouvelle interface de programmation des EJB entité est appelée Java Persistance API.
  
  ## Les EJB message
  
  Depuis la norme EJB 2.0 (2015) , cette architecture propose un troisième type de composant : les EJB message permettant de déclencher un processus côté serveur applicatif lors de la publication d'un message asynchrone. Pour ces composants, le client ne s'adresse pas directement aux composants mais publie un message sur un réceptacle JMS (queue ou topic) configuré sur le serveur applicatif qui va alors déclencher l'activation par ce serveur d'une instance de l'EJB concerné pour pouvoir traiter ce message.
  
  