- 19-02-2008
Spring Framework - первые шаги (Конспект восьмой : Beans scope)
Конспект восьмой : Beans scope
Как я и обещал в одной из предыдущих лекций, пришло время поговорить про диапазоны видимости компонент (beans scope).
Здесь я хотел бы отметить тот факт, что точного и устоявшегося перевода, английского слова scope нет. Просто в среде русскоязычных разработчиков это слово так и прижилось и может использоваться в различных ситуациях. В случае со Spring Framework, оно применимо к зоне видимости той или иной компоненты, объявленной в контексте приложения (application context).
Задумывались ли Вы читая предыдущие лекции о том, какое количество компонент создавалось в примерах с использованием конструкции <bean id=... , думаю - нет. Это и понятно, так как примеры были не сложными и честно говоря, имеющими мало общего с реальной жизнью. Время задуматься над этим вопросом, однако, пришло
. Итак: сколько экземпляров класса MailService Spring Framework поднимет в контексте приложения, если в конфигурационном файле будет выполнено следующее объявление?:
. Итак: сколько экземпляров класса MailService Spring Framework поднимет в контексте приложения, если в конфигурационном файле будет выполнено следующее объявление?:<bean id="mailService"class="com.personality.examples.spring.ioc.SmtpMailService" />
Очевидно, что будет создан только один экземпляр класса SmtpMailService. Происходит это потому, что по умолчанию Spring Framework, поднимает компоненты как Singleton . Таким образом, Spring гарантирует, что в контексте приложения будет один и только один mailService.
Т.о. следующая запись полностью идентична предыдущей:
<bean id="mailService"class="com.personality.examples.spring.ioc.SmtpMailService"scope="singleton" />
Такой подход уместен для связи компонент не сохраняющих своего состояния между вызовами методов. В этом случае говорят о stateless компонентах.
Давайте теперь задумаемся над следующими ситуациями, возникающими в реальной жизни. Например, компонента, инкапсулирующая в себе заказ, который вы оформляете в интернет магазине, со всеми его статусами, суммами, etc. Или, компонента, представляющая собой корзину, в которую каждый пользователь складывает товары, найденные им в том же интернет магазине!? Очевидно, что диапазон видимости Singleton, вряд ли будет уместен в этих случаях. Что же делать? Разработчики Spring Framework предлагают нам использовать следующие scope: singleton, prototype, request, session и global session (подробнее см. п.3.4. Bean scopes - The Spring Framework - Reference Documentation).
Давайте теперь задумаемся над следующими ситуациями, возникающими в реальной жизни. Например, компонента, инкапсулирующая в себе заказ, который вы оформляете в интернет магазине, со всеми его статусами, суммами, etc. Или, компонента, представляющая собой корзину, в которую каждый пользователь складывает товары, найденные им в том же интернет магазине!? Очевидно, что диапазон видимости Singleton, вряд ли будет уместен в этих случаях. Что же делать? Разработчики Spring Framework предлагают нам использовать следующие scope: singleton, prototype, request, session и global session (подробнее см. п.3.4. Bean scopes - The Spring Framework - Reference Documentation).
Так, в вышеуказанном мною примере, для компоненты-корзины (shopping cart bean), уместным будет использовать session scope, тогда для каждого пользователя в контексте приложения будет создаваться свой экземпляр корзины и соответственно Mr.Bean не сможет добавить покупаемую им книгу в корзину Вячеслава Яковенко
. Все было бы ничего, если бы не проблемы, возникающие при взаимном использовании компонент, поднятых с разными scope.
. Все было бы ничего, если бы не проблемы, возникающие при взаимном использовании компонент, поднятых с разными scope.Подумайте о том, что будет если в singleton компоненту была внедрена другая prototype или session компонента (bean)? На этот вопрос мы постараемся ответить в следующей лекции.
| Комментарии к статье "Spring Framework - первые шаги (Конспект восьмой : Beans scope)" (0) |