Quelle est la différence entre @Inject et @EJB
Je suis présentement en train d'apprendre le Java EE 6 modèles de composants et de me confondre avec la dernière injection de dépendance mécanisme. Voici donc mes questions:
1) Quelle est la différence entre @Inject et @EJB
2) Si j'ai un simple POJO qui contient un autre Pojo (dont l'un d'eux est le code DAO), quel serait le meilleur choix: @Inject ou @EJB?
Puis-je mélanger @Inject et @EJB?
Un exemple serait:
-
ClassA implémente InterfaceA et a
une instance de ClassA_Adaptor -
ClassA_Adaptor implémente InterfaceAB
et a une instance de ClassB -
ClassB implémente InterfaceB et a
une instance de ClassB_Adaptor et un
exemple DAO_ClassB -
ClassB_Adaptor implémente InterfaceB
et a une instance de ClassC -
ClassC implémente InterfaceBC et a
une instance de WebService_ClassC -
DAO_ClassB va utiliser JPA 2.0
(@PersistenceContext)
Je voudrais injecter tous d'entre eux, y compris le DAO et le WebService.
3) Est-ce une mauvaise approche à utiliser uniquement transactionnelle pour certaines opérations, mais pas pour tous?
Comme un exemple: Certaines méthodes de la DAO_ClassB sont typique de votre requête, alors que d'autres méthodes sont "écrire" des méthodes. Est-ce mauvais pour ne pas envelopper "LIRE" méthodes de la transaction?
À ma connaissance, le DAO_ClassB peut être enveloppé avec des transactions à l'aide de @EJB (injecter le DAO_ClassB et de faire toutes les méthodes transactionnelles). Comment puis-je contrôler?
Désolé si certaines questions sont confus parce que je sais que des bribes et des morceaux de Java EE 6 nouveau modèle de composant.
Vous devez vous connecter pour publier un commentaire.
@EJB injecte de l'Ejb seulement, mais @Inject peut être utilisé pour injecter des Pojo plutôt que de les Ejb. Toutefois, @Inject exige que votre archive être une BDA (qui contiennent beans.xml pour EE 6, ou implicitement dans EE 7). @Inject a aussi supplémentaires CDI-capacité spécifique (oscilloscopes, les intercepteurs, etc.), mais ces capacités engager des frais généraux supplémentaires. Les serveurs d'Application du support de la spécification @EJB liaisons afin qu'un deployer pouvez choisir la cible EJB, mais @Inject seulement permet au développeur de l'application pour choisir la cible des EJB (et il doit exister dans l'application).
Si la cible n'est pas un EJB, vous ne devez pas utiliser @EJB.
Cela dépend si vous faites de multiples inter-requêtes associées, puis en tentant de prendre des décisions d'affaires. Vous avez besoin de comprendre les niveaux d'isolation et de les prendre en considération, même pour des opérations en lecture seule.
De Adam Biens Weblog:
Vous pouvez utiliser les annotations pour injecter de l'Ejb. Commencez avec @Inject et si vous rencontrez des problèmes, passez à @EJB.
D'autre part, l' @EJB annotation vous permet de passer des informations supplémentaires qu'il pourrait être utile de faire référence à distance Ejb, ou Ejb qui ne peuvent pas être simple injecté dans la "Convention over Configuration" style:
@Inject est plus général que EJB et fait partie de la spécification CDI. Donc, si vous voulez utiliser @Inject, vous avez besoin d'une mise en œuvre de votre serveur.
Pour Pojo (pas Ejb), vous devez utiliser @Inject.