Java / Статьи / Главная страница
05-03-2008

Spring Framework - первые шаги (Конспект десятый)

Напомню задачу, с которой может столкнуться любой Java Developer: "В качестве контроллера в нашей подсистеме будет выступать ShoppingCartShowController, поднятый в контексте приложения как singleton. А в качестве модели, будет выступать компонента ShoppingCart, поднятая в контексте сессии".

Конспект десятый: совместная работа 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 инструментарий, Вам понадобится выполнить следующие шаги:
  1. Заменить <aop:scoped-proxy/> на <aop:scoped-proxy proxy-target-class="false"/>
  2. Обеспечить, чтобы Ваша session-компонента имплементировала хотя бы один интерфейс, и самое важное — чтобы все Ваши singleton компоненты, в которые было выполнено внедрение (DI), работали с ней через эти интерфесы.
Более подробно, вы можете познакомиться с описанным Proxy-механизмом, в разделе 6.6, "Proxying mechanisms" - The Spring Framework - Reference Documentation.

Vyacheslav Yakovenko

Spring Framework - первые шаги (Конспект девятый) :: Spring Framework :: Полезные советы :: @PostConstruct


Комментарии к статье "Spring Framework - первые шаги (Конспект десятый)" (6)

Андрей

29-12-2009 10-32 Не очень понятно одно, почему нельзя было просто указать в shoppingCart scope="session" разве это не гартировало бы извлечения из контеста объекта нужного для данной сессии? А вообще очень хорошая статья, спасибо

Vyacheslav Yakovenko

02-02-2009 09-07 А вот и продолжение: http://lifein.com.ua/java/173

Vyacheslav Yakovenko

13-01-2009 20-56 В ближайшее время будем продолжать ;)

Гость

04-08-2008 17-52 Не понятно. Отличные статьи на этом сайте! Почему не продолжаете в том же духе? Авторы отзовитесь

клубный страусъ

25-06-2008 17-57 ага, ждём

Девелопер

15-06-2008 23-54 Даешь продолжение...


Вам есть, что сказать?




  Введите код