SpringMVC Как получить бин из области сеанса при вызове его конструктора - PullRequest
0 голосов
/ 30 июля 2010

Я довольно новичок в Springframework (как вы догадаетесь) и столкнулся с ситуацией, когда помощь крайне необходима.

У меня есть приложение J2EE здесь, работающее на tomcat с большим количеством старыхкод.В любом случае, мы решили использовать среду Spring для определенных задач.Например, мы хотим сохранить объект безопасности (содержащий имя пользователя и другие свойства, связанные с аутентификацией) в виде бина области действия сеанса.Поскольку существует много старого кода, вызывающего конструктор этого «объекта безопасности», мой вопрос заключается в следующем:

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

Я читал кое-что об "механизме автопровода" ... это поможет мне еще?

Спасибо за ваши ответы и время!

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Если вы используете оператор new, то вы сами создаете объект и вызываете конструктор. Spring не участвует при создании объекта через new.

1 голос
/ 30 июля 2010

Если ваш код создает экземпляр объекта безопасности, вызывая конструктор класса, т.е. вызывая new Security(), он будет каждый раз получать новый экземпляр.

Объявите bean-компонент для вашего объекта безопасности в вашем весеннем файле applicationContext.xml. Чтобы сделать сеанс объекта безопасности доступным, вам нужно объявить его scope как session и сделать его прокси :

<bean id="securityObject" class="com.xyz.Security" scope="session">
    <aop:scoped-proxy /> <!-- important -->
</bean>

Теперь вместо вызова new Security() клиент получит объект Security из контекста приложения Spring (см. Строку 1):

void someMethod() {
    //...
    Security securityObject = applicationContext.getBean("securityObject"); // 1
    securityObject.doSomething(); // 2
    //...
}

Spring позаботится о создании экземпляров Security для каждого сеанса. Объект, возвращаемый вызовом в строке 1, не является фактическим Security объектом, а вместо этого является proxy объектом. Когда securityObject.doSomething() вызывается в строке 2, прокси-объект ищет фактический объект, созданный для этого сеанса , и делегирует ему вызов. Это будет осуществляться весной.

Обратите внимание, что для получения компонента в строке 2 вам сначала понадобится дескриптор объекта ApplicationContext. Как вы получите этот объект, будет зависеть от того, где находится вызывающий код. Редактировать: Простой способ получить его единообразно - реализовать интерфейс ApplicationContextAware .

Примечание: Вместо того, чтобы получать bean-компонент из контекста приложения, вы можете подключить его к Spring, но для этого потребуется объявить bean-компоненты для всех клиентов, которым требуется объект безопасности. Поскольку вы модифицируете существующее приложение, я думаю, что вышеуказанный подход лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...