spring mvc; Порядок загрузки contextConfigLocation

#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 стороне.

После того, как это было сказано, следующее невозможно

  • RootApplicationContext —> ServletApplicationContext
    • не имеет смысла, что компонент со стороны сервера хочет получить доступ к веб-стороне (плохая практика)

Давным-давно я не использую web.xml , но

  • DispatcherServlet contextConfigLocation (через <init-param> ) представляет ServletApplicationContext
  • ContextLoaderListener contextConfigLocation (через <context-param> ) представляет RootApplicationContext

Не имеет значения, объявлены ли компоненты через:

  • XML
  • JavaConfig
  • аннотации @Controller и т.д.

Spring управляет циклом о том, в каком порядке создаются компоненты. Поэтому не имеет значения, как .xml объявлены файлы (в вашем случае) (о порядке).