Стандартное веб-приложение Spring (созданное Roo или шаблоном «Spring MVC Project») создает файл web.xml с помощью ContextLoaderListener
и DispatcherServlet
. Почему они не только используют DispatcherServlet
и заставляют загружать полную конфигурацию?
Я понимаю, что ContextLoaderListener следует использовать для загрузки материалов, не относящихся к сети, а DispatcherServlet используется для загрузки материалов, относящихся к сети (контроллеры, ...). И это приводит к двум контекстам: родительскому и дочернему.
Задний план:
Я делал это стандартным образом несколько лет.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Handles Spring requests -->
<servlet>
<servlet-name>roo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Это часто вызывало проблемы с двумя контекстами и зависимостями между ними. В прошлом мне всегда удавалось найти решение, и у меня есть сильное чувство, что это всегда улучшает структуру / архитектуру программного обеспечения. Но теперь я столкнулся с проблемой событий обоих контекстов .
- Однако это заставляет меня переосмыслить этот шаблон с двумя контекстами, и я спрашиваю себя: почему я должен ввязываться в эту проблему, почему бы не загрузить все файлы конфигурации Spring с одним DispatcherServlet
и ContextLoaderListener
полностью удалить файл . (У меня по-прежнему будут разные файлы конфигурации, но только один контекст.)
Есть ли причина не удалять ContextLoaderListener
?
Ответы:
В вашем случае нет, незачем оставлять
ContextLoaderListener
иapplicationContext.xml
. Если ваше приложение отлично работает только с контекстом сервлета, придерживаться этого будет проще.Да, обычно поощряемый шаблон состоит в том, чтобы хранить не веб-материалы в контексте уровня веб-приложений, но это не более чем слабое соглашение.
Единственные веские причины использовать контекст уровня веб-приложений:
DispatcherServlet
компаний, которым нужно поделиться услугамиDelegatingFilterProxy
,OpenEntityManagerInViewFilter
и т.д.)К вам ничего из этого не относится, поэтому дополнительная сложность неоправданна.
Просто будьте осторожны при добавлении фоновых задач в контекст сервлета, таких как запланированные задачи, соединения JMS и т. Д. Если вы забудете добавить
<load-on-startup>
в свойweb.xml
, эти задачи не будут запущены до первого обращения к сервлету.источник
DispatcherServlet
без конфигурации - если бы вы это сделали, у вас не было бы веб-интерфейса. Все материалы MVC должны быть там.Вы можете настроить контекст приложения и наоборот. Например, чтобы заставить OpenEntityManagerInViewFilter работать. Настройте ContextLoaderListener, а затем настройте свой DispatcherServlet с помощью:
Просто убедитесь, что значение параметра contextConfigLocation пустое.
источник
Я хочу поделиться тем, что я сделал в своем приложении Spring-MVC:
На
we-mvc-config.xml
я добавил только классы аннотированные с @Controller:По
applicationContext.xml
файлам добавил все остальное:источник