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

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

Обратите внимание, что нас не интересуют специфичные для веба области действия bean-компонентов, такие как сеанс или запрос; все службы являются одноэлементными.

Ниже показан соответствующий фрагмент кода

MyServlet extends LegacyServletSuperclass
{
   private MyThreadSafeServiceBean wantThisToBeAutowiredBySpring;
   ....

}

person Peter    schedule 17.03.2010    source источник


Ответы (1)


Вы можете использовать @Configurable в сочетании с <context:load-time-weaver /> и использовать @Autowired в своих сервлетах. Это позволяет использовать классы, которые не созданы Spring, для обработки Spring.

Вы также можете использовать другой подход - в методе init(..) вашего сервлета:

ApplicationContext ctx = 
    WebApplicationContextUtils.getWebApplicationContext(servletContext);
if (ctx != null) {
    ctx.getAutowireCapableBeanFactory().autowireBean(this);
}

Это установит все пружинные зависимости (где используются @Autowired/@Resource). Это будет работать, если классы обслуживания будут определены весной, что, как я предполагаю, так и есть.

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

person Bozho    schedule 17.03.2010
comment
Спасибо, мы рассмотрим их. Я приму ответ, если не появятся и не будут успешно реализованы другие идеи. - person Peter; 24.03.2010