Spring JSF intégration: comment injecter un Printemps composante/service managed bean JSF?
Je comprends qu'un managed bean fonctionne comme un contrôleur, car votre seule tâche est de "lier" le point de Vue de la Couche avec le Modèle.
À l'utilisation d'un bean managed bean je me dois de déclarer @ManagedBean
d'annotation, de faire ce que je peux communiquer JSF avec des fèves directement.
Si je veux injecter certains composants (à partir du Printemps) dans ce managedBean j'ai deux façons possibles:
-
Choisissez la propriété dans ManagedBean (comme "BasicDAO dao") et de déclarer
@ManagedProperty(#{"basicDAO"})
au-dessus de la propriété. De le faire, je suis l'injection de la fève"basicDAO"
de Printemps dans ManagedBean. -
Déclaré @Contrôleur dans ManagedBean Classe, puis je vais avoir
@ManagedBean
et@Controller
annotations, tous ensemble. Et dans propriété"BasicDAO dao"
je dois utiliser@Autowired
de Printemps.
Est ma compréhension correcte?
Vous devez vous connecter pour publier un commentaire.
Il y a une autre façon d'utiliser le Printemps-géré les haricots dans la JSF-haricots contrôlés par une simple extension de votre JSF haricot de la
SpringBeanAutowiringSupport
et le Printemps va gérer l'injection de dépendance.@ManagedBean
est DEPRECATED dans le programme JSF. Mais comme vous le voyez l'interlocuteur mentionne@ManagedBean
dans la question et, de nouveau, comme vous le voyez "54 upvoted réponse", mentionne à propos de@ManagedBean
ainsi. Et encore, comme vous le voyez, j'ai commencé ma réponse en disant: "Il est une autre façon". Honnêtement, je ne pensais pas que ma réponse serait accepté à la place de @BalusC excellente réponse. Je voulais juste montrer un autre moyen plus facile. Je ne comprends pas comment ai-je pu mériter ces "je suis presque enclin à downvote" les mots 🙂 "même personne qui a posé la question?" lol, non 😀 Avez-vous déjà essayé cela avant? 🙂@ManagedBean
sont pas valides. C'était il y a 4 ans, pas de maintenant. Si l'OP juste changé la accepté de répondre après toutes ces années, j'ai sérieusement ne pas espère qu'il va changer tout son code ;-). L'affaire est close... Cheers!!!@ManagedBean
vs@Controller
Tout d'abord, vous devez choisir un cadre pour la gestion de vos haricots. Vous devez choisir soit JSF ou de Printemps (ou CDI) pour la gestion de vos haricots. Tandis que les œuvres suivantes, il est fondamentalement erronée:
Vous vous retrouvez avec deux complètement séparé des instances de la même managed bean classe, l'un géré par JSF et un autre géré par Spring. Ce n'est pas directement clair qu'on aurait fait être utilisé dans EL lorsque vous faites référence à elle comme
#{someBean}
. Si vous avez laSpringBeanFacesELResolver
inscrit dansfaces-config.xml
, alors il serait le Printemps-géré, pas la JSF géré par un. Si vous n'avez pas cela, alors il serait la JSF géré par un.Aussi, lorsque vous déclarez un managed bean JSF champ d'application spécifique, comme
@RequestScoped
,@ViewScoped
,@SessionScoped
ou@ApplicationScoped
dejavax.faces.*
paquet, il ne sera reconnu et utilisé par@ManagedBean
. Il ne sera pas compris par@Controller
qu'il attend de ses propres@Scope
annotation. Par défaut, c'est singleton (champ d'application), lorsqu'ils sont absents.Lorsque vous faites référence à la ci-dessus bean via
#{someBean}
, il serait de retour le Printemps, géré par l'application étendue de haricot, de ne pas le JSF gérés en vue de l'étendue de haricot.@ManagedProperty
vs@Autowired
Dans le cadre du programme spécifique de
@ManagedProperty
ne fonctionne que dans JSF-managed beans, c'est à dire lorsque vous êtes en utilisant@ManagedBean
. Le Printemps spécifiques@Autowired
ne fonctionne qu'au Printemps géré les haricots, c'est à dire lorsque vous êtes en utilisant@Controller
. Ci-dessous les approches sont plus ou moins équivalentes et ne peuvent pas être mélangés:Notez que lorsque vous avez la
SpringBeanFacesELResolver
inscrit dansfaces-config.xml
que par la javadoc,et donc vous pouvez référencer Printemps géré les haricots dans EL via
#{springBeanName}
, alors vous pouvez simplement référence dans@ManagedProperty
aussi, comme dans la règle pour l'essentiel le résultat évaluée de l'expression EL. À l'inverse, l'injection d'un managed bean JSF via@Autowired
, n'est en aucune façon pris en charge. Vous pouvez cependant utiliser@Autowired
dans un managed bean JSF lorsque vous étendez votre haricot de laSpringBeanAutowiringSupport
. Cela va automatiquement s'inscrire dans le cadre du programme managed bean instance dans le Ressort autowirable contexte au cours de constructeur invocation, ce qui signifie que tout ce que@Autowired
sera disponible dans@PostConstruct
et plus tard.Ou lorsque votre architecture ne permet pas l'extension de haricots provenant d'une autre classe de base, alors vous pouvez toujours vous inscrire manuellement le JSF managed bean instance dans le Ressort autowirable contexte comme ci-dessous. Voir aussi Comment intégrer JSF 2 et le Printemps (ou 3 Ressort 4) bien pour l'astuce.
@XxxScoped
vs@Scope
Du printemps
@Scope
a un support limité pour le JSF étendues. Il n'y a pas d'équivalent pour le JSF est@ViewScoped
. Vous serait essentiellement soit homegrow votre propre étendues, ou s'en tenir à enregistrer manuellement la JSF managed bean instance dans le Ressort autowirable contexte comme indiqué ci-dessus.Et, de l'autre côté, Spring WebFlow a été repris en JSF 2.2 via de nouveaux
@FlowScoped
annotation. Donc, si vous arrive d'être sur JSF 2.2 déjà, alors vous n'avez pas nécessairement besoin d'utiliser Spring WebFlow si vous souhaitez uniquement l'étendue de flux.CDI - essayer d'unifier tous les
Depuis Java EE 6, CDI est proposé en standard alternative au Printemps DI. Il a respectivement
@Named
et@Inject
annotations pour cela, et également son propre ensemble d'étendues. Je ne suis pas sûr de savoir comment il interagit avec le Printemps que je n'utilise pas le Printemps, mais@Inject
fonctionne à l'intérieur d'un@ManagedBean
, et@ManagedProperty
à l'intérieur d'un@ManagedBean
peut faire référence à une@Named
bean. D'autre part,@ManagedProperty
ne fonctionne pas à l'intérieur d'un@Named
bean.Le but de CDI est de regrouper tous les différents bean cadres de gestion en une seule spécification/interface. Le printemps pourrait avoir été un plein CDI mise en œuvre, mais ils ont choisi d'implémenter que partiellement (seulement JSR 330
javax.inject.*
est pris en charge, mais la JSR-299javax.enterprise.context.*
pas). Voir aussi Printemps de soutien CDI? et ce tutoriel.JSF déménage au CDI du bean de gestion et de railler
@ManagedBean
et amis dans une future version.Voir aussi:
Le moyen facile de le faire est par l'intermédiaire de XML. J'ai utilisé
@Component
déjà fait jsf managed bean mais@Autowired
n'a pas fonctionné car managed bean était déjà là dans faces-config.xml. Si elle est obligatoire pour garder que le managed bean définition et gestion de la propriété dans le fichier xml, il est suggéré d'ajouter le printemps de haricots comme une autre propriété gérée à l'intérieur du managed bean tag. Ici le printemps bean est-il défini dans spring-config.xml(peut être autocâblés quelque part en alternance). veuillez vous référerhttps://stackoverflow.com/a/19904591/5620851
édité par moi. Je suggère de les mettre en œuvre complètement à travers l'annotation @Géré et @Composant ou via xml pour les deux.