ContextLoaderListener или нет?
стандартное веб-приложение spring (созданное Roo или шаблоном "Spring MVC Project") создает веб.xml с ContextLoaderListener и DispatcherServlet. почему они не используют только DispatcherServlet и сделать это, чтобы загрузить полную конфигурацию?
Я понимаю, что ContextLoaderListener должен использоваться для загрузки материала, который не является веб-релевантным, а DispatcherServlet используется для загрузки веб-релевантных материалов (контроллеры,...). И это приводит к двум контекстам: родитель и a дочерний контекст.
Справочная информация:
Я делаю это стандартным способом в течение нескольких лет.
<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?
3 ответов:
в вашем случае, нет смысла держать
ContextLoaderListenerиapplicationContext.xml. Если ваше приложение отлично работает только с контекстом сервлета, который придерживается этого, это проще.да, обычно поощряемый шаблон состоит в том, чтобы держать не-веб-материал в контексте уровня веб-приложения, но это не более чем слабое соглашение.
единственными вескими причинами для использования контекста уровня веб-приложения являются:
- если у вас есть несколько
DispatcherServletчто нужно делиться услуги- если у вас есть устаревшие / не Spring сервлеты, которые нуждаются в доступе к Spring-wired services
- если у вас есть фильтры сервлетов, которые подключаются к контексту уровня веб-приложения (например, Spring Security
DelegatingFilterProxy,OpenEntityManagerInViewFilter, etc)ни один из них не относится к вам, поэтому дополнительная сложность неоправданна.
просто будьте осторожны при добавлении фоновых задач в контекст сервлета, таких как запланированные задачи, соединения JMS и т. д. Если вы забыли добавить
<load-on-startup>наweb.xml, то эти задачи не будут запущены до первого доступа сервлета.
вы можете настроить контекст приложения и наоборот. Например, чтобы сделать OpenEntityManagerInViewFilter работа. Настройка ContextLoaderListener а затем настроить DispatcherServlet с:
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> </servlet>просто убедитесь, что contextConfigLocation значение параметра пустое.
Я хочу поделиться тем, что я сделал в своем приложении Spring-MVC:
на
we-mvc-config.xmlя добавил только классы с аннотацией @Controller:<context:component-scan base-package="com.shunra.vcat"> <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/> </context:component-scan>на
applicationContext.xmlфайлы я добавил все остальные:<context:component-scan base-package="com.shunra.vcat"> <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> </context:component-scan>
Comments