J'ai trouvé cette question: quelle est la différence entre @Inject et @EJB mais je n'ai pas été plus sage. Je n'ai jamais fait Java EE auparavant et je n'ai pas d'expérience avec l'injection de dépendances, donc je ne comprends pas ce que je dois utiliser?
@EJB est-il une ancienne méthode d'injection? L'injection est-elle effectuée par le conteneur EJB lors de l'utilisation de cette annotation tout en utilisant @Inject utiliser le nouveau framework CDI? Est-ce la différence et devrais-je utiliser @Inject au lieu de @EJB si tel est le cas?
la source
@EJB
fonctionne l'injection circulaire (un bean singleton et un autre bean ayant besoin d'une référence l'un à l'autre)? (en référence à ma réponse ci-dessous - je ne suis pas sûr si je fais la bonne chose en passant à@EJB
)@Inject
peut injecter n'importe quel bean, alors que@EJB
ne peut injecter que des EJB. Vous pouvez utiliser l'un ou l'autre pour injecter des EJB, mais je préfère@Inject
partout.la source
Mise à jour: cette réponse peut être incorrecte ou obsolète. Veuillez consulter les commentaires pour plus de détails.
Je suis passé de
@Inject
à@EJB
car@EJB
permet l'injection circulaire alors que le@Inject
vomit dessus.Détails: j'avais besoin
@PostConstruct
d'appeler une@Asynchronous
méthode, mais cela se ferait de manière synchrone. La seule façon de faire l'appel asynchrone était d'avoir l'appel d'origine à une méthode d'un autre bean et de lui faire rappeler la méthode du bean d'origine. Pour ce faire, chaque grain avait besoin d'une référence à l'autre - donc circulaire.@Inject
a échoué pour cette tâche alors qu'il@EJB
travaillait.la source
@Inject
les dans les champs publics de l'autre. Si cela fonctionne, ma réponse est fausse. Si cela ne fonctionne pas, ma réponse est correcte jusqu'à présent. Ensuite, changez le@Inject
en@EJB
(et annotez éventuellement les classes elles-mêmes? J'oublie.). Ensuite, l'injection mutuelle cyclique devrait fonctionner correctement. C'est pourquoi je suis passé de@Inject
à@EJB
. J'espère que cela a du sens.Voici une bonne discussion sur le sujet. Gavin King recommande @Inject sur @EJB pour les EJB non distants.
http://www.seamframework.org/107780.lace
ou
https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace
et
la source
Il peut également être utile de comprendre la différence en terme d'identité du bean de session lors de l'utilisation de @EJB et @Inject. Selon les spécifications, le code suivant sera toujours
true
:Utiliser @Inject au lieu de @EJB, ce n'est pas la même chose.
voir aussi l' identité des beans session sans état pour plus d'informations
la source
L'injection existait déjà dans Java EE 5 avec les annotations @Resource, @PersistentUnit ou @EJB, par exemple. Mais il était limité à certaines ressources (source de données, EJB ...) et à certains composants (Servlets, EJB, backing bean JSF ...). Avec CDI, vous pouvez injecter presque n'importe quoi n'importe où grâce à l'annotation @Inject.
la source