Я немного запутался, что использовать в следующей ситуации:
Предположим, сервлет создает приложение, которое обрабатывает сеанс http пользователя, и приложение это:
public class Application extends AbstractHTTPApplication {
@Inject
private Instance<MainView> mainView;
public void setupApplication() {
this.setView( mainView.get() );
}
Позже у меня есть @SessionScoped
bean-компонент 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, каждому пользовательскому сеансу будет даваться новый, и независимо от того, где он @Inject
ed, он будет ссылаться на , что пользователя 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-компонент с областью действия-, не так ли?
Думаю, я просто пытаюсь понять, как все это работает. Спасибо за помощь!