Прежде всего: контекст, загружаемый DispatcherServlet
, и контекст, загружаемый ContextLoaderListener
, - это два разных контекста.
DispatcherServlet
загружает свой контекст самостоятельно. По умолчанию он ищет файл конфигурации, используя шаблон [servletName]-servlet.xml
. Так что для DispatcherServlet
с именем dispatcher
это будет dispatcher-servlet.xml
. Но вы можете указать собственное имя файла, используя contextConfigLocation
параметр сервлета:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:custom-name-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
В вашем приложении может быть несколько экземпляров DispatcherServlet
. Каждый экземпляр представляет отдельное приложение MVC. И каждый экземпляр имеет свой собственный изолированный контекст. DispatcherServlet
экземпляры не могут получить доступ к контекстам друг друга.
ContextLoaderListener
загружает так называемый root контекст. Вы можете иметь только один root контекст в вашем приложении (или не иметь его вообще). И каждый экземпляр DispatcherServlet
имеет доступ к этому контексту. Таким образом, вы можете рассматривать этот контекст как родительский контекст, в то время как контекст DispatcherServlet
является дочерним контекстом. Каждый раз, когда вашему приложению требуется получить экземпляр компонента, он сначала будет искать компонент в дочернем контексте. Если приложение не находит бин в дочернем контексте, оно начинает искать в root контексте.
Более подробную информацию вы можете найти в документации Spring. Глава Контекстная иерархия .