Spring @Autowired и WebApplicationContext в Tomcat - PullRequest
1 голос
/ 07 мая 2010

@ Autowired работает только один раз.

Что нужно сделать, чтобы подключать бин каждый раз, когда сервлет воссоздается?

Мое веб-приложение (контейнер Tomcat6) состоит из 2 сервлетов. Каждый сервлет имеет частные поля.

Их установщики помечены @ Autowired

В методе init я использую

WebApplicationContextUtils
...
autowireBean(this);

Автоматически связывает свойства, помеченные @Autowired один раз - во время инициализации сервлета .

Любой другой сеанс увидит значения этих полей, они не будут перезаписаны после уничтожения предыдущего сеанса.

Что нужно сделать, чтобы они перепрограммировали их каждый раз, когда вызывается конструктор сервлетов?

а) Поместить автопроводку в конструктор?

Или лучше 2) получить контекст веб-приложения и извлечь из него бин?

Ответы [ 3 ]

1 голос
/ 07 мая 2010

Кажется, есть некоторое недопонимание о том, как работает контейнер. Сервлеты по сути являются одиночными, вы не получаете новый сервлет каждый раз, когда кто-то вызывает сервер. Сохранение состояния в приватных полях сервлета в значительной степени является ошибкой.

Каков объем и жизненный цикл сохраняющей состояние части обработки вашего запроса? Если это просто срок действия запроса, то вы можете взять все, что у вашего сервлета с состоянием, и переместить его в другой класс. Затем вы можете определить прототип bean для этого класса и использовать getBean в начале запроса, чтобы получить новый. Если вы хотите начать фантазировать, вы можете написать фильтр, который помещает новый компонент в ThreadLocal в начале каждого запроса.

Если ваше состояние должно охватывать несколько запросов, вам нужно начать сохранять состояние или ключ, который указывает на хранилище состояний в веб-сеансе, или изучить использование среды диалога.

1 голос
/ 07 мая 2010

Попробуйте использовать область действия в качестве прототипа для этого компонента @Scope("prototype")

0 голосов
/ 29 июня 2011

Вы можете попробовать использовать @Scope ("session")

...