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 инструментарий, Вам понадобится выполнить следующие шаги:

  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


This entry was posted in Java, Main menu and tagged . Bookmark the permalink.
  • u041eu0447u0435u043du044c u0434u043eu0441u0442u0443u043fu043du043eu0435 u0438 u043fu043eu043du044fu0442u043du044bu0435 u043au043eu043du0441u043fu0435u043au0442u044b u043fu043eu043bu0443u0447u0438u043bu0438u0441u044c. u0421u043fu0430u0441u0438u0431u043e!

  • Ramzescorp

    Можно поподробнее про префикс aop, что это за пространство имен?

  • Heorhi Puhachou

    Здорово. Недавно начал разбираться с Spring – тут всё доходчиво написано. Автор, Вы всё ещё работаете над статьями? Хотелось бы увидеть что-то в этом же духе с примерами для аннотаций и бинов… Спасибо за написанное.

    • Эх, … хотелось бы чтобы было время работать над статьями 😉 . Но я подумаю!

  • Александр

    Спасибо огромное! Очень доходчиво!

  • Pasha Kolesnyk

    Thanks !