107 votes

Java EE 6 @ javax.annotation.ManagedBean vs. @ javax.inject.Named vs. @ javax.faces.ManagedBean

Je sens qu'il y a un peu de désordre dans Java EE 6 spec. Il y a plusieurs ensembles d'annotations.

Nous avons javax.ejb d'annotation comme @Stateful et @Stateless pour la création d'Ejb.

Il y a aussi un @javax.annotation.ManagedBean créer un managed bean.

Il y a des annotations en javax.enterprise.context comme @SessionScoped et @RequestScoped.

Qu'est-ce que plus il y a aussi @ManagedBean et @SessionScoped/@RequestScoped annotations en javax.faces.bean package.

Et pour rendre les choses plus compliqué il y a un paquet javax.inject avec @Named d'annotation.

Quelqu'un peut-il décrire la façon dont ils sont liés l'un à l'autre?

Où puis-je utiliser @EJB, @Inject ou @ManagedPropery d'injecter d'autres haricots?

192voto

Heidarzadeh Points 2152

Tout d'abord permettez-moi de faire quelques précisions:

Managed bean définition : généralement un managed bean est un objet que son cycle de vie (construction, destruction, etc) est géré par un conteneur.

Dans Java ee nous avons de nombreux conteneurs de gérer le cycle de vie de leurs objets, comme JSF conteneur, le conteneur d'EJB, CDI conteneur, conteneur de Servlet, etc.

L'ensemble de ces conteneurs de travail type d'indépendants, ils démarrent en application de l'initialisation du serveur et de l'analyse des classes de tous les artefacts, y compris jar ejb-jar, de la guerre et de l'oreille fichiers dans les temps de déploiement et de recueillir et de stocker des métadonnées sur eux, puis, quand vous avez besoin d'un objet d'une classe à l'exécution, ils vous donneront des instances de ces classes et à la fois le travail terminé, ils vont les détruire.

Donc, nous pouvons dire que nous avons:

  • JSF géré haricots
  • CDI géré haricots
  • EJB géré haricots
  • Et même les Servlets sont gérés haricots, car ils sont instanciés et détruit par un conteneur, qui est un conteneur de servlet.

Alors, quand vous voyez le Managed Bean word, vous devriez vous renseigner sur le contexte ou le type de.(JSF, CDI, EJB, etc.)

Alors vous pourriez vous demander pourquoi nous avons beaucoup de ces conteneurs: autant que je sache, Java EE les gars ont voulu l'injection de dépendance, mais ils n'a pas pu rassembler toutes les exigences dans une spécification, car ils ne pouvaient pas prévoir les besoins futurs et ils ont fait des EJB 1.0 et 2.0, puis 3.0 et maintenant, EJB 3.1 mais l'objectif était de seulement certaines exigences (transaction, distribué modèle de composant, etc).

Dans le même temps (en parallèle), ils ont réalisé qu'ils ont besoin de soutien JSF trop, alors ils ont fait JSF géré les haricots et un autre contenant pour JSF haricots et ils le considéraient comme une mature DI conteneur, mais encore il n'était pas mature et complète de conteneurs.

Après que Gavin King et quelques autres belles les gars ;) faites CDI qui est le plus mature DI conteneur, j'ai vu. CDI (inspiré par Seam2, Guice et Printemps) a été fait pour combler le fossé entre la JSF et EJB et beaucoup d'autres choses utiles comme des pojo injection, de producteur, de méthodes, d'intercepteurs, décorateurs, l'intégration de l'ips, très souple, etc. et il peut même faire ce que JSF EJB et géré les haricots sont à faire, puis nous pouvons avoir juste une mature et puissant conteneur d'injection de dépendances. Mais pour une compatibilité descendante et pour des raisons politiques Java EE gars veulent les garder!!!

Ici vous pouvez trouver la différence et de cas d'utilisation pour chacun de ces types:

JSF Géré les Haricots, les CDI, les Haricots et les Ejb

La JSF a été initialement développé avec ses propres managed bean et l'injection de dépendance mécanisme qui a été renforcée pour JSF 2.0 pour l'annotation à base de haricots. Lorsque le CDI est sorti avec Java EE 6, il a été considéré comme le managed bean cadre de cette plate-forme, et bien sûr, les Ejb obsolètes tous ayant été autour depuis plus d'une décennie.

Le problème, bien sûr, est de savoir lequel utiliser et quand les utiliser.

Commençons par le plus simple, JSF Géré les haricots.

JSF Géré Haricots

En bref, ne pas utiliser si vous êtes en développement Java EE 6 et à l'aide de CDI. Ils fournissent un mécanisme simple pour l'injection de dépendances et définissant la sauvegarde de haricots pour les pages web, mais ils sont beaucoup moins puissants que les CDI des haricots.

Ils peuvent être définis à l'aide de l' @javax.faces.bean.ManagedBean d'annotation qui prend une option de nom de paramètre. Ce nom peut être utilisé pour faire référence à la fève de pages JSF.

La portée peut être appliqué à la fève à l'aide de l'un des différents domaines définis à l' javax.faces.bean paquet incluent la demande, de session, de l'application, de la vue et de la coutume étendues.

@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

Le CDI est la fève de gestion de l'injection de dépendance et de cadre qui a été publié dans le cadre de Java EE 6 et il inclut un complet, complet managed bean installation. CDI haricots sont beaucoup plus avancés et les plus souples que de simples JSF géré les haricots. Ils peuvent faire usage de intercepteurs, la conversation de la portée, des Événements, type d'injection sécuritaires, les décorateurs, les stéréotypes et producteur méthodes.

Pour déployer CDI haricots, vous devez placer un fichier appelé beans.xml dans un répertoire META-INF dans le classpath. Une fois que vous faites cela, alors tous les haricots dans l'emballage devient un CDI bean. Il y a beaucoup de fonctions, en CDI, un trop grand nombre de couvrir ici, mais comme un guide de référence rapide pour JSF-comme les fonctionnalités, vous pouvez définir la portée du bean CDI à l'aide de l'un des domaines définis à l' javax.enterprise.context ensemble (à savoir, demander de la conversation, session et application des étendues). Si vous souhaitez utiliser le bean CDI à partir d'une page JSF, vous pouvez donner un nom à l'aide de l' javax.inject.Named d'annotation. Pour injecter une fève dans un autre bean, vous annoter le terrain avec javax.inject.Inject d'annotation.

@Named("someBean")
@RequestScoped
public class SomeBean {

    @Inject
    private SomeService someService;
}

Injection automatique comme que 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 disposez de plusieurs types de paiement, vous pouvez ajouter un qualificatif pour savoir s'il est asynchrone ou pas. Alors que vous pouvez utiliser l' @Named d'annotation comme un qualificatif, vous ne devriez pas comme il est prévu d'exposer les haricots dans de EL.

CDI gère l'injection de haricots avec dépareillés étendues grâce à l'utilisation de proxies. De ce fait, vous pouvez injecter une portée de la requête fève dans une session d'étendue de haricot et de la référence sera toujours valide sur chaque demande, parce que pour chaque demande le proxy re-connecte à une instance de la portée de la requête bean.

Le CDI possède aussi un support pour les intercepteurs, les événements, la nouvelle conversation de la portée et de nombreuses autres fonctionnalités qui en fait un bien meilleur choix sur la JSF géré les haricots.

EJB

Les ejb sont antérieurs CDI haricots et sont en someways similaires à CDI haricots et d'autres manières très différentes. Principalement, les différences entre les CDI, les haricots et les Ejb est que les Ejb sont :

  • Transactionnelle
  • En local ou à distance
  • En mesure de mettre en pause les haricots stateful permet de libérer des ressources
  • En mesure de faire usage de minuteries
  • Peut être asynchrone

Les deux types d'Ejb sont appelés stateless et stateful. Les Ejb Stateless peut être considéré comme "thread-safe" à usage unique de grains de ne pas maintenir tout état entre deux requêtes web. Les Ejb Stateful faire tenir de l'état, et peut être créé et de s'asseoir autour depuis aussi longtemps que nécessaire jusqu'à ce qu'ils soient éliminés.

La définition d'un EJB est simple, il suffit d'ajouter un javax.ejb.Stateless ou javax.ejb.Stateful d'annotation à la classe.

@Stateless
public class BookingService {

  public String makeReservation(Item Item, Customer customer) {
    ...
    ...
  }
}

Stateless doit avoir dépendants à la portée de tout un stateful session bean peut avoir n'importe quel champ. Par défaut, ils sont transactionnelles, mais vous pouvez utiliser l'attribut transaction d'annotation.

Alors que les Ejb et de CDI et les haricots sont très différents en termes de fonctionnalités, de l'écriture du code à intégrer est très similaire depuis le CDI de haricots peut être injecté dans les Ejb et les Ejb peut être injecté dans les CDI des haricots. Il n'y a pas lieu de faire une distinction lors de l'injection de l'un en l'autre. Encore une fois, les différentes étendues sont gérés par des CDI, grâce à l'utilisation de proxy. Une exception à cela est que les CDI ne prend pas en charge l'injection de distance Ejb, mais qui peut être mis en œuvre par l'écriture d'un simple producteur de la méthode.

L' javax.inject.Named d'annotation ainsi que tous les Qualificatifs peuvent être utilisés sur un EJB de le faire correspondre à un point d'injection.

Quand à utiliser bean

Comment savez-vous quand vous utilisez des haricots qui? Simple.

Ne jamais utiliser JSF géré haricots, sauf si vous travaillez dans un conteneur de servlet et vous ne voulez pas essayer et obtenir de l'CDI de travail dans Tomcat (bien qu'il existe quelques Maven archétypes pour que donc il n'y a pas d'excuse).

En général, vous devez utiliser le CDI haricots, sauf si vous avez besoin de fonctionnalités avancées dans les EJBs, telles que les fonctions. Vous pouvez écrire votre propre intercepteur de faire des CDI haricots transactionnelle, mais pour l'instant, c'est plus simple d'utiliser un EJB jusqu'à ce que le CDI devient transactionnelle CDI haricots qui est juste autour du coin. Si vous êtes coincé dans un conteneur de servlet et utilisez CDI, alors soit écrite à la main de transactions ou de votre propre transaction intercepteur est la seule option sans Ejb.

Si vous devez utiliser @ViewScoped en CDI vous devez

  • l'utilisation de la couture-faces ou MyFaces CODI module. il suffit d'ajouter un à votre classpath et @ViewScoped travaillera en CDI. MyFaces CODI est encore plus solide soutien de @ViewScoped
  • utilisation MyFaces CODI l' @ViewAccessScoped, c'est une extension écrite sur le dessus de CDI par Apache, juste de la télécharger et de l'utiliser @ViewAccessScoped annotation au lieu de @ViewScoped.
  • Utilisation CDI @ConversationScoped et la longueur de course. Voir ici pour plus d'info.

Certaines parties obtenu à partir d' ici.

7voto

jan groth Points 5071

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 êtes probablement deviner ceux d' javax.faces.bean sont de la JSF spec, et ne sont pas liées à la CDI. Ne pas les utiliser à moins d'avoir une très bonne raison de le faire. Et ne jamais les mélanger avec le CDI annotations javax.ejb. Ceci va produire une quantité d'interminables listes de bogues et de subtiles anomalies.

Je recommande généralement que vous écumer les premiers (ou même plus) des pages de l'excellent travail de Soudure de la documentation. Cela devrait vous mettre sur la piste de Java EE 6.

Et n'hésitez pas à poster d'autres questions ici.

2voto

Hein Blöd Points 68

Depuis il n'y a pas de réponses spécifiquement @javax.annotation.ManagedBean,, voici un lien vers la réponse à une question similaire: la Sauvegarde de haricots (@ManagedBean) ou en CDI Haricots (@Nom)?. La spécification peut être trouvé à http://download.oracle.com/otndocs/jcp/managed_beans-1.0-fr-eval-oth-JSpec/. Donc, il me semble que l' @javax.annotation.ManagedBean a été destiné à être une généralisation de l' @javax.faces.bean.ManagedBean.

De ce que j'ai recueillis, JSF Géré les Haricots sont en train d'être abandonné en faveur de CDI Haricots (peut-être obsolète à partir de JSF 2.3?), donc je suppose @javax.annotation.ManagedBean est d'autant plus devenir obsolète maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X