Атрибут DESTROY-METHOD компонента Spring и прототип компонента веб-приложения

Может получить работу атрибут "destroy-method".

Во-первых, даже если я введу имя несуществующего метода в атрибут "destroy-method",

Инициализация Spring завершается нормально (уже странно!).

Далее, когда bean-компонент имеет область действия «прототип», я полагаю, что он должен быть уничтожен перед приложением.

закрыто. Этого не происходит, в моем случае он просто никогда не вызывается.

Хотя после извлечения этого компонента я могу вызвать этот метод явно, и он сделает свою работу.

Не могли бы вы объяснить, почему этот метод никогда не вызывается в моем случае Spring 2.5?

p.s. Метод существует, он общедоступен и не имеет аргументов.

Кажется, это более сложная задача, чем я думал.

Проблема в том, что этот метод destroy вызывается всякий раз, когда контекст закрывается, а это бывает редко.

Мой вопрос таков:

У меня есть веб-приложение. У меня есть bean-компонент с областью видимости "прототип".

Что мне нужно, так это то, что когда текущий сеанс закрывается, этот метод уничтожения автоматически вызывается Spring.

Я могу сделать это вручную, но есть ли решение, как заставить Spring выполнять эту работу? Он уничтожает компонент после уничтожения сеанса, может ли Spring вызвать метод для этого компонента перед его уничтожением?

p.s. Spring не управляет жизненным циклом прототипов bean-компонентов, поэтому Spring не уничтожает их :)


person EugeneP    schedule 11.05.2010    source источник
comment
может быть, вы должны попытаться изучить аспекты   -  person ant    schedule 11.05.2010
comment
можете ли вы объяснить, что делает этот компонент, почему вам нужно уничтожать его на каждом сеансе и т. д.? У меня такое ощущение, что вы, возможно, задаете вопрос, основываясь на том, что, по вашему мнению, вам нужно решить, но у настоящей проблемы/проблемы может быть гораздо более простое решение. Например, обрабатывает ли этот компонент какие-либо ресурсы (например, соединение с базой данных)?   -  person matt b    schedule 11.05.2010
comment
@matt b Предположим, что когда сеанс закрывается, этот компонент должен зарегистрировать заявление, что меня уничтожают. Теперь я вижу, что Spring НЕ ОБРАБАТЫВАЕТ прототипы, поэтому есть только один способ: сделать это вручную, в сервлете, вручную. Весна тут не поможет.   -  person EugeneP    schedule 11.05.2010
comment
Это полный спектр вашего варианта использования? Если это так, просто используйте HttpSessionListener.   -  person matt b    schedule 11.05.2010
comment
@Espen @matt b Мне просто нужна область сеанса! Spring управляет этим, и, конечно, я могу использовать его вместо прототипа. Чудесно!   -  person EugeneP    schedule 13.05.2010


Ответы (1)


Контейнер Spring не управляет бинами-прототипами.

Фрагмент из справочная документация:

Таким образом, хотя методы обратного вызова жизненного цикла инициализации вызываются для всех объектов независимо от области действия, в случае прототипов настроенные обратные вызовы жизненного цикла уничтожения не вызываются.

Если возможно, попробуйте область запроса или сеанса.

Когда сеанс HTTP в конечном итоге отбрасывается, bean-компонент, область действия которого относится к этому конкретному сеансу HTTP, также отбрасывается.

Кстати: область сеанса и запроса работает только в том случае, если вы используете ApplicationContext с поддержкой Интернета, например XmlWebApplicationContext.

person Espen    schedule 11.05.2010