Java EE 6 @javax.annotation.ManagedBean vs @javax.injecter.Nommé vs @javax.face.ManagedBean
je pense qu'il y a un petit gâchis dans la spécification Java EE 6. Il y a plusieurs séries d'annotations.
Nous avons javax.ejb
annotations comme @Stateful
et @Stateless
pour la création d'Ejb.
il y a aussi un @javax.annotation.ManagedBean
pour créer un haricot géré.
il y a des annotations dans javax.enterprise.context
comme @SessionScoped
et @RequestScoped
.
de plus il y a aussi @ManagedBean
et @SessionScoped
/ @RequestScoped
annotations dans le paquet javax.faces.bean
.
et pour rendre les choses plus compliquées il y a un paquet javax.inject
avec une annotation @Named
.
est-ce que quelqu'un peut décrire comment ils sont reliés les uns aux autres?
Où puis-je utiliser @EJB
, @Inject
ou @ManagedPropery
pour injecter d'autres haricots?
3 réponses
tout d'abord laissez-moi faire quelques clarifications:
haricot contrôlé définition : généralement, un haricot contrôlé est un objet dont le cycle de vie (construction, destruction, etc.) est géré par un contenant.
en Java ee nous avons de nombreux conteneurs qui gèrent le cycle de vie de leurs objets, comme JSF conteneur, EJB conteneur, CDI conteneur, Servlet conteneur, etc.
tous ces conteneurs fonctionnent en quelque sorte indépendants, ils initialisent l'initialisation du serveur d'application et scannent les classes de tous les artefacts, y compris jar, ejb-jar, les fichiers war et ear en temps de déploiement et rassemblent et stockent des métadonnées à leur sujet, puis quand vous avez besoin d'un objet d'une classe à l'exécution, ils vous donneront des instances de ces classes et après avoir terminé le travail, ils les détruiront.
Donc, nous pouvons dire que nous avons:
- JSF managed beans 1519310920 "fèves gérées par le CDI
- EJB managed beans
- et même Servlets sont gérés haricots parce qu'ils sont instanciés et détruits par un conteneur, qui est un conteneur de servlets.
ainsi quand vous voyez le mot Bean géré, vous devriez demander sur le contexte ou le type de celui-ci.(JSF, CDI, EJB, etc.)
alors vous pourriez demander pourquoi nous avons beaucoup de ces conteneurs: AFAIK, Java EE gars ont voulu ont un cadre d'injection de dépendances, mais ils n'ont pas pu rassembler toutes les exigences dans une spécification parce qu'ils ne pouvaient pas prédire les exigences futures et ils ont fait EJB 1.0 et puis 2.0 et puis 3.0 et maintenant 3.1 mais la cible D'EJB était pour quelques exigences seulement (transaction, modèle de Composant distribué, etc).
en même temps (en parallèle) ils ont réalisé qu'ils ont besoin de soutenir JSF aussi, puis ils ont fait JSF haricots gérés et un autre conteneur pour JSF haricots et ils considéraient qu'il s'agissait d'un conteneur mature DI, mais il n'était pas encore complet et mature.
après que Gavin King et quelques autres gars sympas;) fait CDI qui est le plus mature di conteneur que j'ai vu. Le CDI (inspiré de Seam2, Guice et Spring) a été conçu pour combler le vide entre JSF et EJB et beaucoup d'autres choses utiles comme l'injection pojo, les méthodes de production, les intercepteurs, les décorateurs, l'intégration SPI, très flexible, etc. et il peut même faire ce que L'EJB et JSF ont géré les haricots font alors nous pouvons avoir juste un récipient de DI mûr et puissant. Mais pour des raisons de compatibilité rétrograde et des raisons politiques Java EE gars veulent les garder!!!
ici vous pouvez trouver la différence et utiliser des étuis pour chacun de ces types:
JSF Géré les Haricots, les CDI, les Haricots et les Ejb
JSF a été initialement développé avec son propre mécanisme géré d'injection de haricots et de dépendance qui a été amélioré pour le JSF 2.0 afin d'inclure les haricots annotés. Lorsque le CDI a été lancé avec Java EE 6, Il a été considéré comme le cadre bean géré pour cette plate-forme et, bien sûr, EJBs obsolète tous les ayant été autour de bien plus d'une décennie.
le problème est bien sûr de savoir qui utiliser et quand les utiliser.
commençons par le plus simple, JSF Managed beans.
JSF Managed Beans
en bref, ne les utilisez pas si vous développez pour Java EE 6 et utilisez CDI. Ils fournissent un mécanisme simple pour l'injection de dépendances et la définition des fèves de renfort pour les pages web, mais ils sont beaucoup moins puissants que les fèves CDI.
ils peuvent être définis en utilisant l'annotation @javax.faces.bean.ManagedBean
qui prend un paramètre de nom optionnel. Ce nom peut être utilisé pour faire référence au haricot des pages JSF.
peut être appliqué à la fève en utilisant l'une des différentes portées définies dans le paquet javax.faces.bean
qui inclut les portées request, session, application, view et custom.
@ManagedBean(name="someBean")
@RequestScoped
public class SomeBean {
....
....
}
JSF haricots ne peut pas être mélangé avec d'autres sortes de haricots sans une sorte de manuel de codage.
CDI Haricots
CDI est le bean management and dependency injection framework qui a été publié dans le cadre de Java EE 6 et il comprend un installation complète et complète de gestion des haricots. Les fèves CDI sont beaucoup plus évoluées et flexibles que les fèves JSF simples gérées. Ils peuvent faire usage d'intercepteurs, de portée de conversation, D'événements, d'injection sécuritaire, de décorateurs, de stéréotypes et de méthodes de production.
pour déployer des haricots CDI, vous devez placer un fichier appelé haricots.xml dans un dossier META-INF sur classpath. Une fois que vous faites cela, alors chaque haricot dans le paquet devient un haricot CDI. Il y a beaucoup de fonctionnalités dans le CDI, trop de couvrez ici, mais comme une référence rapide pour les fonctionnalités de type JSF, vous pouvez définir le champ D'application du CDI en utilisant l'un des champs définis dans le paquet javax.enterprise.context
(à savoir, les champs requête, conversation, session et application). Si vous voulez utiliser la fève CDI d'une page JSF, vous pouvez lui donner un nom en utilisant l'annotation javax.inject.Named
. Pour injecter un haricot dans un autre haricot, vous annotez le champ avec l'annotation javax.inject.Inject
.
@Named("someBean")
@RequestScoped
public class SomeBean {
@Inject
private SomeService someService;
}
injection automatique comme ça défini ci-dessus peut être contrôlé par l'utilisation de Qualificatifs qui peuvent aider à correspondre à la catégorie spécifique que vous voulez injectée. Si vous avez plusieurs types de paiement, vous pouvez ajouter un qualificatif pour savoir s'il est asynchrone ou non. Alors que vous pouvez utiliser l'annotation @Named
comme un qualificatif, vous ne devriez pas car il est prévu pour exposer les haricots dans EL.
CDI s'occupe de l'injection des haricots avec des lunettes de visée mal assorties à l'aide de procurations. De ce fait, vous pouvez injecter un requête scoped bean dans une session scoped bean et la référence sera toujours valide sur chaque requête car pour chaque requête, le proxy se connecte de nouveau à une instance live de la requête scoped bean.
CDI a également le soutien pour les intercepteurs, les événements, le nouveau cadre de conversation et de nombreuses autres fonctionnalités qui en fait un bien meilleur choix que les haricots JSF gérés.
EJB
les Ejb sont antérieurs CDI haricots et sont en quelque sorte similaires aux haricots du CDI et d'autres façons très différentes. Principalement, la différence entre les haricots CDI et les haricots EJBs est que les EJBs sont:
- Transactionnelle
- en local ou à Distance
- capable de passiver des haricots d'état libérant des ressources
- capable d'utiliser des minuteries
- peut être asynchrone
les deux types d'EJBs sont appelés apatrides et stateful. Les EJB apatrides peuvent être considérés comme des haricots à usage unique et sans danger qui ne maintiennent aucun État entre deux requêtes web. Les EJB Stateful tiennent l'état et peuvent être créés et s'asseoir autour aussi longtemps qu'ils sont nécessaires jusqu'à ce qu'ils soient éliminés.
définir une EJB est simple, il suffit d'ajouter une annotation javax.ejb.Stateless
ou javax.ejb.Stateful
à la classe.
@Stateless
public class BookingService {
public String makeReservation(Item Item, Customer customer) {
...
...
}
}
les haricots apatrides doivent avoir une dépendance portée alors qu'un haricot de session stateful peut avoir n'importe quelle portée. Par défaut, ils sont transactionnelles, mais vous pouvez utiliser l'attribut transaction d'annotation.
alors que les haricots EJBs et CDI sont très différents en termes de caractéristiques, l'écriture du code pour les intégrer est très similaire car les haricots CDI peuvent être injectés dans les grains EJBs et les grains EJBs peuvent être injectés dans les grains CDI. Il n'est pas nécessaire de faire de distinction lors de l'injection de l'un dans l'autre. Encore une fois, les différents champs d'application sont gérés par le CDI. grâce à l'utilisation de proxy. Une exception à cela est que le CDI ne supporte pas l'injection d'EJBs à distance mais qui peut être implémentée en écrivant une méthode simple de producteur pour cela.
l'annotation javax.inject.Named
ainsi que tout qualificatif peuvent être utilisés sur un EJB pour l'apparier à un point d'injection.
quand utiliser quel haricot
Comment savoir quand utiliser quel haricot? Simple.
N'utilisez jamais de haricots JSF managés à moins que vous ne travailliez dans un container servlet et que vous ne vouliez pas essayer de faire travailler le CDI à Tomcat (bien qu'il y ait quelques archétypes Maven pour cela donc il n'y a pas d'excuse).
en général, vous devez utiliser CDI beans à moins que vous n'ayez besoin des fonctionnalités avancées disponibles dans les EJBs telles que les fonctions transactionnelles. Vous pouvez écrire votre propre intercepteur pour rendre les fèves CDI transactionnel, mais pour l'instant, il est plus simple d'utiliser un EJB jusqu'à ce que le CDI obtient des haricots CDI transactionnel qui est juste au coin. Si vous êtes coincé dans un conteneur servlet et que vous utilisez le CDI, alors les transactions écrites à la main ou votre propre intercepteur de transaction est la seule option sans EJBs.
si vous devez utiliser @ViewScoped
dans CDI vous devez
- utiliser couture-faces ou MyFaces CODI module. il suffit d'ajouter un à votre classpath et
@ViewScoped
travaillera au CDI. MyFaces CODI a un support encore plus solide de @ViewScoped - utiliser le code de MyFaces
@ViewAccessScoped
, c'est une extension écrite sur le dessus de CDI par Apache, juste télécharger it et utiliser@ViewAccessScoped
annotation au lieu de@ViewScoped
. - utiliser CDI
@ConversationScoped
et le faire à long terme. Voir ici pour plus d'informations . - Utiliser Omnifaces @ViewScoped annotation
certaines parties ont été volées de ici .
Yep, ce qui peut être source de confusion.
Pour certains ehm des raisons historiques, JSF et CDI sont à l'aide de la même annotations pour les étendues, mais à partir de différents paquets.
comme vous le supposez probablement ceux de javax.faces.bean
sont de la spécification JSF, et ne sont pas liés au CDI. Ne les utilisez que si vous avez une très bonne raison de le faire. Et ne les mélangez jamais avec les annotations CDI de javax.ejb
. Ceci va produire une pure des listes interminables de bogues et d'anomalies subtiles.
je vous recommande généralement de parcourir les premières pages (ou même plus) de l'excellente Weld documentation . Cela devrait vous mettre sur la bonne voie pour Java EE 6.
Et n'hésitez pas à poster d'autres questions ici.
Puisqu'il n'y a pas de réponse spécifique à propos de @javax.annotation.ManagedBean
, voici un lien vers la réponse d'une question similaire: haricots de soutien (@ManagedBean) ou haricots CDI (@Named)? . La spécification peut être trouvée à http://download.oracle.com/otndocs/jcp/managed_beans-1.0-fr-eval-oth-JSpec / . Il me semble donc que @javax.annotation.ManagedBean
était censé être une généralisation de @javax.faces.bean.ManagedBean
.
D'après ce que j'ai compris, les haricots JSF gérés sont en cours l'abandon progressif en faveur des haricots CDI (peut-être dévalorisé par le JSF 2.3?), donc je suppose que @javax.annotation.ManagedBean
est d'autant plus devenir obsolète maintenant.