Bean-объекты в рамках сеанса Spring как зависимости в bean-компонентах-прототипах? - PullRequest
11 голосов
/ 11 марта 2011

Я читал весенние документы на эту тему несколько раз, но некоторые вещи до сих пор мне неясны.Документация гласит:

Если вы хотите внедрить (например) bean-объект области действия HTTP-запроса в другой bean-компонент, вы должны внедрить AOP-прокси вместо этого bean-объекта.То есть вам нужно внедрить прокси-объект, который предоставляет тот же открытый интерфейс, что и объект области действия, но который также может извлечь реальный целевой объект из соответствующей области (например, HTTP-запрос) и делегировать вызовы метода в реальный объект.

Пример конфигурации выглядит следующим образом:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
     <aop:scoped-proxy/>
</bean>

<bean id="userManager" class="com.foo.UserManager">
     <property name="userPreferences" ref="userPreferences"/>
</bean>

Здесь, userManager bean определен как синглтон.Итак, мне интересно, применяется ли этот прокси-компонент только к бинам синглтоновой области, то есть, если вы хотите внедрить бин с веб-областью в синглтон-бины, или это также относится к бинам-прототипам?Например, если userManager был задан в качестве прототипа?

Я спрашиваю об этом, потому что я видел некоторый код, который внедряет бины сессионной области в прототипы без aop-прокси, но я неконечно, если это правильно ... В частности, это были компоненты DAO в некоторых веб-приложениях, имеющие область действия session , и они были внедрены в контроллеры с прототипом для многопользовательской среды.Это правильный путь?Как в целом должны быть ориентированы компоненты DAO / Service в среде веб-приложений?

Любая идея приветствуется.

1 Ответ

22 голосов
/ 11 марта 2011

Вы всегда можете добавить боб с более широкой областью действия (например, синглтон) в боб с более узкой областью действия (например, сессионный компонент), но для этого вам понадобится прокси-сервер с областью действия.

Итак, ваш пример внедрения bean-объекта с сессионной областью в bean-объект с прототипной областью является хорошим, поскольку область действия сессии "шире", чем область действия прототипа.

Если вы ошиблись, Spring будетсказать тебе.Если он не жалуется, то вам это не нужно.

...