#java #spring
Пытаюсь понять разницу между областями бинов Singleton и Global-session. Если мы делаем Singleton то контекст возвращает один и тот же бин. final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml"); При вызове context.getBean(SomeClass.class) будет возвращаться один и тот же объект если scope=singleton или ничего, но если мы укажем scope=globalSession, то результат будет тот-же. Но есть же неявная разница... А в чем? Как ее увидеть? И для чего это может помочь? Спасибо.
Ответы
Ответ 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)
Комментариев нет:
Отправить комментарий