В типичном приложении Spring есть 2 ApplicationContext
экземпляра, один - это так называемый корневой контекст приложения, а второй (или третий или ...) - сервлет . контекст приложения.
Приложение root обычно содержит общие / общие ресурсы, такие как DataSource
, службы, репозитории и т. Д. ... Контекст servlet содержит компоненты, специфичные для этого контекста, обычно такие вещи, как view resolver, отображения обработчиков, контроллеры и т. д. Контекст сервлета использует корневой контекст в качестве родительского и, таким образом, может видеть определенные в нем bean-компоненты (корень не знает о контекстах сервлета!).
В этой типовой настройке корневой контекст загружается ContextLoaderListener
, а контекст сервлета - DispatcherServlet
.
В старые времена можно было написать web.xml
, который содержал бы servlet-listener
для ContextLoaderListener
и servlet
для DispatcherServlet
.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"
>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring child -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
ContextLoaderListener
будет загружать applicationContext.xml
по умолчанию и DispatcherServlet
a <servlet-name>-servlet.xml
(следовательно, dispatcher-servlet.xml
).
Начиная со спецификации Servlet 3.0, можно заменить web.xml
конфигурацией на основе Java. Spring взял время, чтобы предоставить базовые классы, которые уже выполняют базовую настройку (например, регистрация ContextLoaderListener
и DispatcherServlet
). Однако, поскольку теперь это полностью конфигурация на основе Java, и ContextLoaderListener
, и DispatcherServlet
необходимо предоставить список классов конфигурации, так как нет имени класса по умолчанию, которое он может обнаружить для загрузки.
Таким образом, getRootConfigClasses()
настроит ContextLoaderListener
и на самом деле является необязательным (вы можете вернуть null
или пустой массив). getServletConfigClasses()
настроит DispatcherServlet
(и обязательно).