Как запускается ContextLoaderListener из Spring, даже если web.xml его не включает?

У меня есть веб-приложение, которое я унаследовал от другой команды, использующей Spring. Я пытался отладить какое-то странное поведение и хотел «отключить» любые весенние сервлеты/фильтры/слушатели контекста.

Поэтому я удалил запись в web.xml, которая выглядела так...

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml
    </param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

Тем не менее, каким-то образом после очистки/сборки и запуска нашего приложения я нажимаю org.springframework.web.context.ContextLoaderListener в методе contextInitialized.

Итак, мой вопрос: если мой web.xml больше не объявлял ContextLoadListener в качестве слушателя для запуска, как и почему он запускается? Я посмотрел, и в источнике Spring 3.2.3-RELEASE, похоже, нет аннотации Servlet 3.0 @WebServletContextListener.

Итак, почему и как работает этот прослушиватель контекста?

введите здесь описание изображения


person benstpierre    schedule 28.04.2016    source источник
comment
Есть ли у вас какие-либо WebApplicationInitializer классы в пути к классам?   -  person Sotirios Delimanolis    schedule 28.04.2016
comment
Проверьте, загружает ли сервлет-диспетчер какую-либо конфигурацию.   -  person 11thdimension    schedule 28.04.2016
comment
Да org.glassfish.jersey.server.spring.SpringWebApplicationInitializer. На самом деле две версии: одна 2.5.1, а другая 2.22.1.   -  person benstpierre    schedule 28.04.2016


Ответы (1)


В Servlet 3.0 представлен ServletContainerInitializer

Интерфейс, который позволяет библиотеке/среде выполнения уведомляться о фазе запуска веб-приложения и выполнять любую необходимую программную регистрацию сервлетов, фильтров и прослушивателей в ответ на это.

Если у вас есть jar spring-web в пути к классам, он неявно регистрирует собственную реализацию этого интерфейса, SpringServletContainerInitializer. Это, в свою очередь, сканирует реализации WebApplicationInitializer в пути к классам.

Очевидно, у вас есть SpringWebApplicationInitializer, который

[...] инициализирует контекст Spring, добавляя Spring ContextLoaderListener к ServletContext.

ContextLoaderListener, которое вы видите, скорее всего, происходит от этого.

person Sotirios Delimanolis    schedule 28.04.2016