Я немного смущен тем, что использовать в следующей ситуации:
Предположим, сервлет создает приложение, которое обрабатывает пользовательский 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()
каждый раз возвращать один и тот же bean-компонент для одного и того же пользователя?
Я использую Glassfish 3.1.2.
Дополнительная информация
Класс приложения внедряется в сервлет в новом 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
bean:
@SuppressWarnings("serial")
@SessionScoped
public class ApplicationWrapper implements Serializable {
@Inject
private AbstractCdiApplication application;
public AbstractCdiApplication getApplication() {
return application;
}
}
Разве это не означает, что вызов @Inject SSB usersSSB
в любом месте MainView (или любого объекта в сеансе этого пользователя) должен дать мне bean-компонент этого пользователя в области сеанса и всегда тот же самый сеанс- bean-компонент с ограниченной областью действия для сеанса каждого пользователя? Значение -- разные пользователиSSB для разных пользователей, потому что у каждого пользователя своя сессия.
В конце концов, Application
сам по себе является bean-компонентом SessionScoped
, внедренным и присоединенным к HTTP-сессии пользователя с помощью метода getNewApplication
сервлета? Я имею в виду, в конце концов, это объект Application, который внедряет и прикрепляет класс MainView, верно? Итак, это означает, что MainView — это bean-компонент с областью действия сеанса, не так ли?
Думаю, я просто пытаюсь понять, как все это работает. Спасибо за помощь!