- 05-03-2008
Spring Framework - первые шаги (Конспект десятый)
Конспект десятый: совместная работа singleton и session компонент
Как я и обещал в прошлой лекции, в этот раз мы рассмотрим проблему, возникающую в том случае когда компонента поднятая в контексте приложения как singleton, должна по роду службы обращаться к компоненте поднятой в session диапазоне.
Напомню задачу, с которой может столкнуться любой Java Developer: "В качестве контроллера в нашей подсистеме будет выступать ShoppingCartShowController, поднятый в контексте приложения как singleton. А в качестве модели, будет выступать компонента ShoppingCart, поднятая в контексте сессии".
Как ни странно, но решение задачи более чем простое, смотрим листинг:
<!-- a HTTP Session-scoped bean exposed as a proxy --><bean id="shoppingCart" class="com.personality.ShoppingCart" scope="session"><!-- this next element effects the proxying of the surrounding bean --><aop:scoped-proxy/></bean><!-- a singleton-scoped bean injected with a proxy to the above bean --><bean id = "shoppingCartController" class = "com.personality.mvc.ShoppingCartShowController "><!-- a reference to the proxied 'shoppingCart' bean --><property name="shoppingCart" ref="shoppingCart"/></bean>
По сути решение задачи оказалось достаточно не сложным, нам пришлось только добавить тэг <aop:scoped-proxy/> в описание бина ShoppingCart, остальную же работу на себя взял Spring Framework.
Пожалуй, в этом вопросе осталось только одно белое пятно: на осное чего Spring будет предоставлять нам "чудесную" услугу!? Во-первых, Spring предоставляет ее за счет поддержки AOP, подставляя нашему контроллеру Proxy вместо самой ShoppingCart компоненты. Во-вторых, прокси может создаваться, как с помощью стандартных средств, входящих в Java SDK, так и с помощью библиотеки CGLib.
По умолчанию Spring использует CGLib, так что в случае листинга, приведенного выше Вам придется позаботиться, чтобы cglib-nodep-2.1_3.jar находился в classpath Вашего приложения.
Если же Вам по каким либо причинам Вам необходимо завязаться на стандартный Java инструментарий, Вам понадобится выполнить следующие шаги:
- Заменить <aop:scoped-proxy/> на <aop:scoped-proxy proxy-target-class="false"/>
- Обеспечить, чтобы Ваша session-компонента имплементировала хотя бы один интерфейс, и самое важное — чтобы все Ваши singleton компоненты, в которые было выполнено внедрение (DI), работали с ней через эти интерфесы.
Более подробно, вы можете познакомиться с описанным Proxy-механизмом, в разделе 6.6, "Proxying mechanisms" - The Spring Framework - Reference Documentation.
Vyacheslav Yakovenko
Spring Framework - первые шаги (Конспект девятый) :: Spring Framework :: Полезные советы :: @PostConstruct
Vyacheslav Yakovenko
Spring Framework - первые шаги (Конспект девятый) :: Spring Framework :: Полезные советы :: @PostConstruct
| Комментарии к статье "Spring Framework - первые шаги (Конспект десятый)" (6) |
| 29-12-2009 10-32 Не очень понятно одно, почему нельзя было просто указать в shoppingCart scope="session" разве это не гартировало бы извлечения из контеста объекта нужного для данной сессии? А вообще очень хорошая статья, спасибо |
|
|
| 13-01-2009 20-56 В ближайшее время будем продолжать ;) |
| 04-08-2008 17-52 Не понятно. Отличные статьи на этом сайте! Почему не продолжаете в том же духе? Авторы отзовитесь |
| 25-06-2008 17-57 ага, ждём |
| 15-06-2008 23-54 Даешь продолжение... |