La compréhension cdi Exemple<>.get() vs @Inject
Je suis un peu confus au sujet de l'utiliser dans la situation suivante:
Supposons que la servlet crée une Application qui gère l'utilisateur de la session http, et l'application est: est-ce
public class Application extends AbstractHTTPApplication {
@Inject
private Instance<MainView> mainView;
public void setupApplication() {
this.setView( mainView.get() );
}
Plus tard, j'ai un @SessionScoped
bean SSB
que je veux injecter dans chaque utilisateur bean:
@SessionScoped
public class SSB {}
Maintenant, quand j'ai essayé régulièrement @Inject SSB ssb;
comme un champ dans MainView
, je ne suis pas un nouveau SSB
pour chaque utilisateur:
public class MainView {
@Inject
private SSB usersSSB;
public someMethod() {
usersSSB.doSomething();
System.identityHashCode( usersSSB );
}
}
Test avec deux utilisateurs, j'ai le même instance de usersSSB
à la fois de l'utilisateur séances. Je ne pensais pas que c'était possible... je pensais que, depuis la SSB est SessionScoped, un nouveau sera donné à chaque session de l'utilisateur, et peu importe où il est @Inject
ed il s'en réfère à que de l'utilisateur SSB
.
Au lieu de cela, j'ai essayé:
public class MainView {
@Inject
private Instance<SSB> usersSSB;
public someMethod() {
usersSSB.get().doSomething();
System.identityHashCode( usersSSB.get() );
}
}
Maintenant il signale un autre usersSSB
pour chaque utilisateur, enfin.
Ce qui se passe ici? Quand je l'appelle usersSSB.get()
plus tard dans chaque session de l'utilisateur, le usersSSB.get()
retour que même haricot pour que même de l'utilisateur à chaque fois?
Je suis en cours d'exécution sur Glassfish 3.1.2.
Quelques Infos
La classe d'Application est d'être injecté dans le Servlet sur un nouveau HttpServletRequest:
public abstract class AbstractCdiApplicationServlet extends
AbstractApplicationServlet {
@Inject
protected Instance<ApplicationWrapper> wrapper;
@Override
protected Application getNewApplication(HttpServletRequest request)
throws ServletException {
return wrapper.get().getApplication();
}
...etc etc
Et la ApplicationWrapper
est un SessionScoped
bean:
@SuppressWarnings("serial")
@SessionScoped
public class ApplicationWrapper implements Serializable {
@Inject
private AbstractCdiApplication application;
public AbstractCdiApplication getApplication() {
return application;
}
}
N'est pas ce à dire que l'appel de @Inject SSB usersSSB
n'importe où dans MainView (ou tout objet à l'intérieur de cette session de l'utilisateur) devrait me donner la session de cet utilisateur dans l'étendue du haricot, et toujours que même session d'étendue de haricot, pour chaque session utilisateur? Sens-différents usersSSB pour les différents utilisateurs, car chaque utilisateur a une session différente.
Après tout, la Application
lui-même est un SessionScoped
bean, injecté dans et fixé à l'utilisateur de la Session HTTP par le getNewApplication
méthode de la servlet? Je veux dire, c'est l'objet qui injecte et attache la MainView classe, après tout, pas vrai? Ce qui signifie que MainView est une session d'étendue de haricot, n'est-ce pas?
Je suis juste essayer de comprendre comment tout cela fonctionne, je suppose. Merci pour l'aide!
Pour être honnête, je n'ai pas assez solide poignée sur ce pour faire un simple test de cas... Est-il un travail archétype maven qui va vous commencez avec un http servlet création d'une application pour chaque nouvelle session? Je pourrais l'utiliser pour construire un projet de test et post-it.
OriginalL'auteur Christopher Poile | 2012-03-26
Vous devez vous connecter pour publier un commentaire.
Cela arrive parce que '@Inject Exemple<> " est dynamique obtenue contrairement à '@Inject'
Si vous ne '@Inject " dans ApplicationScoped bean, alors l'injection est obtenue qu'une seule fois donc en ApplicationScoped bean sera cette même référence pour tous les utilisateurs
Si vous appelez .get() sur '@Inject Exemple<> " alors référence à la SSB est obtenue de façon dynamique à chaque fois lorsque vous appelez .get()
Plus sur l'injection, vous pouvez lire ici: http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/injection.html
@Inject
dans un SessionScoped bean (MainView) donnent le même objet que l'utilisateur, toujours? Et si@Inject
donner un objet à un autre utilisateur, car ils sont dans une autre session?Ce que vous obtenez est un proxy qui va faire la recherche de la ressource correcte à chaque fois.
Ne devrait pas @Inject donner une procuration à la bonne ressource aussi?
OriginalL'auteur Krzysztof Miksa