10
votes

EJB3 - Obtention de haricot par injection vs recherche - Quelles sont les différences, les implications, les gotchas?

Il y a deux façons de pouvoir obtenir une instance EJB:

  • Injection de dépendance dans des servlets et EJBS via l'annotation @ejb
  • jndi recherche via context.lookup n'importe où

    Quelles sont les différences, les implications et les gotchas à l'aide de l'une de ces approches? Sont-ils les mêmes? L'injection de dépendance est-elle plus rapide que la recherche? Qu'en est-il de la gestion de la transaction et de la gestion du cycle de vie d'objet?

    Des choses dont je suis au courant comprennent:

    Annotation

    • fonctionne avec des servlets et des éjbs uniquement
    • Syntaxe pratique
    • conteneur indépendant

      recherche

      • peut instancier différentes implémentations de l'interface EJB à titre programmable au moment de l'exécution.
      • travaille de n'importe où - par ex. Pojos.
      • dépend de la convention de conteneur de dénomination

0 commentaires

3 Réponses :


2
votes

Recherche dépend de la présence de la mise en œuvre JNDI, c'est-à-dire que vous devez configurer la mise en oeuvre JNDI afin d'exécuter des tests d'unité, puis des champs annotés peuvent être configurés manuellement.


0 commentaires

6
votes

Les deux atteignent le même résultat. C'est plus une question de couplage . Avec l'annotation, vous obtenez un couplage lâche et il est plus facile de moquer et de tester. Avec la recherche directe, vous dépendez du contexte initial qui peut être parfois peu pratique.

imho recherche ne fonctionne pas partout . Par exemple, dans Glassfish, une recherche sur une EJB locale d'un pojo ne fonctionnera que si elle a été "importée" précédemment avec @ejbs (...) sur l'une des beans de session qui utilise le pojo. Voir Cette discussion . Vous devez comprendre la différence entre les local local et JNDI global pour cela.

Mon conseil serait: utiliser l'annotation autant que possible. Si un pojo a besoin d'une référence à un EJB, passez-le comme paramètre (par exemple dans le constructeur). Cela s'appelle l'inversion de dépendance et est de toute façon une bonne pratique.


0 commentaires

0
votes

Je pense que c'est gentil un dur de se moquer de JJB annoté. Lorsque vous utilisez la recherche, vous pouvez construire un commutateur en fonction de votre environnement (test -> loginmockbean, production -> loginbean).


1 commentaires

C'est juste faux. Si cela est injecté par le conteneur, cela signifie que vous pouvez plus facilement l'injecter vous-même dans les tests, par exemple Mybean Bean = Nouvelle mybean (); haricot.Injectbean = nouveau moqueur () . L'accrochage dans la recherche est plus compliqué, surtout si le code dépend de nouvel initialContext () . Comment rendez-vous une version spéciale du contexte pour vos tests?