@Stateless
. Le cycle de vie d'un EJB sans état comporte deux états :
PostConstruct
, cette méthode doit être annotée par
@PostConstruct
.
@PreDelete
, si elle existe.
transient
et utiliser une forme
ad hoc
de sauvegarde. Lorsque le client revient, son instance peut être sortie de sa passivation, et continuer à servir ses requêtes.
@PostConstruct
est invoquée, si elle existe.
Le passage de l'état
method ready
à
does not exist
s'accompagne également de l'appel à la méthode annotée
@PreDestroy
, si elle existe.
La passivation et le réveil d'un EJB (transitions entre les états
method ready
et
passivate
) s'accompagne également de l'appel de deux méthodes, annotées
@PrePassivate
et
@PostActivate
respectivement, si elles existent.
Un EJB dans l'état
passivate
peut passer dans l'état
does not exist
, mais dans ce cas aucune méthode n'est appelée. Ce qui est assez logique, puisque que dans l'état
passivate
notre pauvre EJB n'est probablement qu'un amas informe d'octets rangés dans un tableau.
Rappelons que l'état
method ready in TX
n'est utilisé que si la méthode métier est déclarée transactionnelle. Si tel est le cas, le passage de l'état
method ready
à
method ready in TX
peut s'accompagner de l'appel à plusieurs
callbacks
.
Ces
callbacks
sont appelés si l'EJB session implémente l'interface
SessionSynchronization
, qui définit les trois méthodes suivantes :
afterBegin()
: appelée une fois que la transaction a démarré.
beforeCompletion()
: appelée juste avant l'appel à la méthode
commit()
de la transaction.
afterCompletion(boolean)
: appelée une fois que la méthode
commit()
a fini de s'exécuter. Si la transaction est un succès, cette méthode est appelée avec l'argument
true
. Dans le cas contraire, elle est appelée avec l'argument
false
.
afterBegin()
est appelée par le serveur d'applications au moment du démarrage de la transaction. Cette méthode est appelée une fois que la transaction a démarré (l'appel à sa méthode
begin()
a rendu la main). Il est donc possible de faire des opérations en base, qui seront menées à bien dans la transaction de la méthode métier. Lorsque cette méthode rend la main, alors l'EJB passe dans l'état
method ready in TX
.
Lorsque la méthode métier termine son exécution, le gestionnaire de transactions fait un appel à la méthode
commit()
de la transaction dans laquelle cette méthode s'est exécutée. L'appel de cette méthode peut se terminer de deux façons : un succès ou un échec. En cas de succès, le retour de la méthode métier est envoyé au client, il s'agit du cas nominal. En cas d'échec, une exception est envoyée au client.
La méthode
beforeCompletion()
est appelée par le serveur d'applications avant l'appel à la méthode
commit()
de la transaction.
La méthode
afterCompletion(boolean)
est appelée par le serveur d'application une fois la transaction validée. Si cette validation est un succès, cette méthode est appelée avec le paramètre
true
, et
false
dans le cas contraire. L'EJB est donc informé du succès ou non de la transaction, et peut mettre à jour son état dans ces deux cas.
@Resource
: permet d'injecter toutes les ressources disponibles auprès de l'annuaire du serveur d'application. Cette annotation prend entre autres un attribut
mappedName
, que l'on fixe au nom de cette ressource. Dans certains cas ce nom est facultatif, s'il n'y a pas d'ambiguïté sur le champ injecté. C'est le cas pour
UserTransaction
.
@EJB
: permet d'injecter directement un autre EJB. Si un unique EJB implémente l'interface du champ injecté, cette annotation s'utilise sans attribut. S'il y a ambiguïté, on peut la lever en donnant le nom de l'EJB dans le paramètre
mappedName
.
@PersistenceContext
: permet d'injecter un
entity manager
. On doit préciser le nom de l'unité de persistance dans l'attribut
unitName
.
Exemple 67. Éléments injectés dans un EJB
@Stateless(mappedName="MarinService") @Remote(MarinService.class) public class MarinServiceImpl implements MarinService { // il n'y a qu'une seule transaction, pas besoin // de fixer de nom pour la ressource injectée @Resource private UserTransaction transaction ; // la source de données injectée doit être précisée // par son nom @Resource(mappedName="jdbc/CoursEJBDS") private DataSource datasource ; // le contexte de persistance injecté doit être précisé // par son nom @PersistenceContext(unitName="cours-ear-pu") private EntityManager em ; // injection d'un EJB : si l'interface BateauService // n'est implémentée qu'une fois, pas besoin // de fixer de nom pour la ressource injectée @EJB private BateauService bateauService ; // suite de la classe }
@PostConstruct
. Elles peuvent varier d'une invocation de méthode à une autre, c'est notamment le cas de
UsertTransaction
.