Разница между bean scope Singleton и Global-session?

519
03 сентября 2017, 01:43

Пытаюсь понять разницу между областями бинов Singleton и Global-session.

Если мы делаем Singleton то контекст возвращает один и тот же бин.

final ClassPathXmlApplicationContext context =
            new ClassPathXmlApplicationContext("spring-context.xml");

При вызове context.getBean(SomeClass.class) будет возвращаться один и тот же объект если scope=singleton или ничего, но если мы укажем scope=globalSession, то результат будет тот-же.

Но есть же неявная разница...

А в чем? Как ее увидеть? И для чего это может помочь? Спасибо.

Answer 1

Из документации Spring :

singleton (Default) Scopes a single bean definition to a single object instance per Spring IoC container.
session Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
globalSession Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a Portlet context. Only valid in the context of a web-aware Spring ApplicationContext.

singleton-бин имеет один экземпляр в пределах всего IoC-контейнера
session-бин имеет один экземпляр в пределах HTTP-сессии и умирает вместе с ней:

When the HTTP Session is eventually discarded, the bean that is scoped to that particular HTTP Session is also discarded.

globalSession-бин почти аналогичен session - он используется в портлетных веб приложениях. Когда вы используется globalSession-бин в "стандартном" сервлетном приложении эти бины имеют session-scope:

If you write a standard Servlet-based web application and you define one or more beans as having globalSession scope, the standard HTTP Session scope is used, and no error is raised

Но есть же неявная разница...
А в чем? Как ее увидеть?

Чтобы увидеть, что session-бин имеет разные экземпляры в разных сессиях (в "стандартном" spring веб-приложении), вы, например, можете обратиться к одному и тому же методу контроллера, в котором есть этот бин, из 2 окон браузера (одно в обычном режиме, другое в инкогнито). Пример из приложения под рукой:

r.p.f.r.service.BlankServiceImpl@6f7b9a10 (1 окно - http-сессия 1)
r.p.f.r.service.BlankServiceImpl@18d5bfc0 (2 окно - http-сессия 2)  

При повторных запросах используются все те же экземпляры (т.к. http-сессии все еще живые).
Если scope бина singleton, то экземпляр всегда один и тот же:

r.p.f.r.service.BlankServiceImpl@1fec9d33 (1 окно - http-сессия 1)
r.p.f.r.service.BlankServiceImpl@1fec9d33 (2 окно - http-сессия 2)
READ ALSO
Проблема с JDBC в Birt

Проблема с JDBC в Birt

Всем привет!

623
Постраничный вывод данных

Постраничный вывод данных

Добрый день, есть один вопросик, добавил в дао метод с переменной count(нужно для подсчета страниц), в контроллере его вызвал requestsetAttribute("counts",...

431
Hibernate перезаписывает данные

Hibernate перезаписывает данные

Доброго дня, товарищиСтолкнулся с такой проблемой: сконфигурировал Hibernate, начал записывать сущности, всё хорошо, но после перезапуска приложения...

367
Hibernate - Неправильный запрос к БД

Hibernate - Неправильный запрос к БД

Привет всем! Такая ситуация:

397