Понимание cdi Instance<> и.get()vs @Inject

Я немного запутался, что использовать в следующей ситуации:

Предположим, сервлет создает приложение, которое обрабатывает сеанс http пользователя, и приложение это:

public class Application extends AbstractHTTPApplication {

@Inject
private Instance<MainView> mainView;

public void setupApplication() {
   this.setView( mainView.get() );
}

Позже у меня есть @SessionScopedbean-компонент SSB, который я хочу внедрить в bean-компонент каждого пользователя:

@SessionScoped
public class SSB {}

Теперь, когда я попробовал обычный @Inject SSB ssb;в качестве поля в MainView, я не получаю новый SSBдля каждого пользователя:

public class MainView {

@Inject
private SSB usersSSB;

   public someMethod() {
       usersSSB.doSomething();
       System.identityHashCode( usersSSB );
   }
}

Тестирование с двумя пользователями, я получаю один и тот же экземпляр usersSSBв сеансах обоих пользователей. Я не думал, что это возможно... Я думал, что, поскольку SSB имеет SessionScoped, каждому пользовательскому сеансу будет даваться новый, и независимо от того, где он @Injected, он будет ссылаться на , что пользователя SSB.

Вместо этого я попробовал:

public class MainView {

@Inject
private Instance<SSB> usersSSB;

   public someMethod() {
       usersSSB.get().doSomething();
       System.identityHashCode( usersSSB.get() );
   }
}

Теперь, наконец, он сообщает разные usersSSBдля каждого пользователя.

Что здесь происходит? Когда я вызову usersSSB.get()позже в сеансе каждого пользователя, будет ли usersSSB.get()возвращать один и тот же компонент для того же пользователя каждый раз?

Я использую Glassfish 3.1.2.

Дополнительная информация

Класс Application внедряется в сервлет по новому запросу 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

И ApplicationWrapperявляется компонентом SessionScoped:

@SuppressWarnings("serial")
@SessionScoped
public class ApplicationWrapper implements Serializable {
@Inject
private AbstractCdiApplication application;

public AbstractCdiApplication getApplication() {
    return application;
}
 }

Не означает ли это, что вызов @Inject SSB usersSSBгде угодно в MainView (или любой объект в сеансе этого пользователя)должен давать мне компонент сеанса-пользователя, и всегда тот же самый сеанс-компонент области действия, для каждого сеанса пользователя? Значение --разные пользователиSSB для разных пользователей, потому что у каждого пользователя своя сессия.

В конце концов, Applicationсам по себе является компонентом SessionScoped, внедренным и присоединенным к HTTP-сессии пользователя с помощью метода getNewApplicationсервлета? Я имею в виду,в конце концов, это объект Application, который внедряет и прикрепляет класс MainView, верно? Значит, MainView — это bean-компонент с областью действия-, не так ли?

Думаю, я просто пытаюсь понять, как все это работает. Спасибо за помощь!

8
задан Christopher Poile 28 March 2012 в 21:55
поделиться