春天mvc; contextConfigLocation加载顺序

时间:2016-10-03 22:56:09

标签: spring spring-mvc

我正在重新配置webapp。我想将调度程序servlet中的所有内容移到ContextLoaderListener中。 (这是由于安全配置的变化超出了本问题的范围)

问题1,如果我有多个应用程序上下文xml文件,它们的加载顺序是否重要?例如,是否需要在指定DAO和服务bean的xml文件之前加载包含context:component-scan的xml文件?

问题2,(或者这有点?)我如何指定加载* _applicationContext.xml的顺序,假设应该在应该加载的B_applicationContext.xml之前加载A_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 个答案:

答案 0 :(得分:3)

一些建议:

这些天考虑通过Javaconfig进行Spring的配置。

回答问题1和2非常重要,您了解以下内容:

  • 运行应用程序时,Spring会创建一个Application Context,其中存在由Spring创建和管理的所有bean。现在考虑一下Application Context,应该从两个&#39;来创建它。应用程序上下文,通常它们被提到&#39;在文档中ServletApplicationContextRootApplicationContext的方式
    • 前者应该扫描所有关于网络的信息,例如您的@Controller@Bean关于基础设施,例如ViewResolver等。
    • 后者应该扫描有关服务器的所有信息,例如@Service@Repositories以及@Bean关于基础设施,例如DataSource等< / LI>

了解以下内容非常重要:

  • ServletApplicationContext - &gt; RootApplicationContext
    • 这意味着前者可以访问后者(它关于使用依赖性,即:@Controller需要@Service)。因此,它反映了Web方可以访问server方。

一旦这样说,以下是可能

  • RootApplicationContext - &gt; ServletApplicationContext
    • 没意识到服务器端的Bean想要访问Web端(不好的做法)

很久以前我没有使用web.xml但是

  • DispatcherServlet + contextConfigLocation(通过<init-param>)代表ServletApplicationContext
  • ContextLoaderListener + contextConfigLocation(通过<context-param>)代表RootApplicationContext

通过以下方式声明bean无关紧要:

  • XML
  • JavaConfig
  • 注释@Controller

Spring管理bean的创建顺序。因此,无论如何声明.xml文件(在您的情况下)(关于订单)。