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 @Injected 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!

C'est très étrange. Avez-vous de cet exemple sont disponibles pour les essais?
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