#spring #spring-mvc
#spring #spring-mvc
Вопрос:
Я перенастраиваю веб-приложение. Я хочу переместить все из диспетчерского сервлета в ContextLoaderListener. (Это связано с изменениями в конфигурации безопасности, выходящими за рамки этого вопроса)
Вопрос 1, если у меня есть несколько XML-файлов контекста приложения, имеет ли значение, в каком порядке они загружаются? Например, нужно ли загружать XML-файл, содержащий context:component-scan, перед XML-файлом, определяющим DAO и служебные компоненты?
Вопрос 2, (или это спорный вопрос?) как бы мне указать порядок, в котором *_applicationContext.xml загружаются при условии, что A_applicationContext.xml должны быть загружены до B_applicationContext.xml который должен быть загружен перед C_applicationContext.xml
Мой web.xml заключается в следующем:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>AssessmentDelivery</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AssessmentDelivery</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/*_applicationContext.xml</param-value>
</context-param>
<!-- security filter -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
Ответ №1:
Некоторые предложения:
В эти дни рассмотрите возможность выполнения конфигурации для Spring через Javaconfig.
Для ответа на вопросы 1 и 2 очень важно, чтобы вы понимали следующее:
- При запуске приложения Spring создает
Application Context
где существуют все компоненты, созданные и управляемые Spring. Теперь рассмотрим, что для этогоApplication Context
он должен быть создан из двух «вспомогательных» контекстов приложений, обычно они «упоминаются» в документации, какServletApplicationContext
иRootApplicationContext
- Первый должен сканировать все о Сети, например, ваши
@Controller
данные и@Bean
информацию об инфраструктуре, например, дляViewResolver
etc.. - Более поздний должен сканировать все о сервере, например,
@Service
и@Repositories
и@Bean
об инфраструктуреDataSource
, например, для и т.д.
- Первый должен сканировать все о Сети, например, ваши
Очень важно понимать следующее:
ServletApplicationContext
—>RootApplicationContext
- Это означает, что первый может получить доступ к последнему (речь идет об использовании зависимостей, то есть: a
@Controller
нуждается в a@Service
). Поэтому это отражает, чтоWeb
сторона может получить доступ кserver
стороне.
- Это означает, что первый может получить доступ к последнему (речь идет об использовании зависимостей, то есть: a
После того, как это было сказано, следующее невозможно
RootApplicationContext
—>ServletApplicationContext
- не имеет смысла, что компонент со стороны сервера хочет получить доступ к веб-стороне (плохая практика)
Давным-давно я не использую web.xml
, но
DispatcherServlet
contextConfigLocation
(через<init-param>
) представляетServletApplicationContext
ContextLoaderListener
contextConfigLocation
(через<context-param>
) представляетRootApplicationContext
Не имеет значения, объявлены ли компоненты через:
XML
JavaConfig
- аннотации
@Controller
и т.д.
Spring управляет циклом о том, в каком порядке создаются компоненты. Поэтому не имеет значения, как .xml
объявлены файлы (в вашем случае) (о порядке).