Если ваш код создает экземпляр объекта безопасности, вызывая конструктор класса, т.е. вызывая 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-компоненты для всех клиентов, которым требуется объект безопасности. Поскольку вы модифицируете существующее приложение, я думаю, что вышеуказанный подход лучше.